এই সমস্যাতে, আমাদের একটি ২D অ্যারে দেওয়া আছে যেটি একটি ২-D স্ক্রিন রিপ্রেজেন্ট করে, একটি পিক্সেলের কোঅর্ডিনেট যেটিকে রঙ করা হবে এবং রঙ। আমাদের কাজ হল কারেন্ট পিক্সেল এবং সেই রঙের সব এডজেসেন্ট পিক্সেল রঙ করার প্রোগ্রাম তৈরি করা।
পেইন্টে রঙ করা, আমরা একটি রঙ সিলেক্ট করি এবং ব্রাশ দিয়ে দেয়া পিক্সেলে ক্লিক করি।
উদাহরণ দেখি:
ইনপুট: Sceen[][] = {{W, W, B, W, W, W, W, W}, {W, W, W, W, W, W, B, B}, {W, B, B, W, W, B, W, W}, {W, Y, Y, Y, Y, B, W, B}, {B, W, W, Y, Y, B, W, B}, {B, W, W, Y, Y, Y, Y, B}, {W, B, W, W, W, Y, W, W}, {W, W, B, B, W, Y, Y, W}}; X = 5, Y = 5, newColor = R. আউটপুট: {{W, W, B, W, W, W, W, W}, {W, W, W, W, W, W, B, B}, {W, B, B, W, W, B, W, W}, {W, R, R, R, R, B, W, B}, {B, W, W, R, R, B, W, B}, {B, W, W, R, R, R, R, B}, {W, B, W, W, W, R, W, W}, {W, W, B, B, W, R, R, W}};
ফ্লাড ফিল অ্যালগরিদম (Flood Fill Algorithm)
এই অ্যালগরিদমে, পিক্সেলগুলো নতুন রঙ দিয়ে রঙ করা হয় যখন সেটি ইতিমধ্যে সিলেক্টেড পুরনো রঙে থাকে। যদি পুরনো রঙ না হয়, তবে সেটি রঙ করা হবে না। একটি পিক্সেল রঙ করার পর, সেটি তার উপর, নিচ, বাম এবং ডান পিক্সেল চেক করে একই কাজ করবে। আরও জানতে এখানে ক্লিক করুন।
সমাধানের পদ্ধতি
একটি পদ্ধতি হল রিকার্সিভ অপ্রোচ ব্যবহার করা। আমরা প্রথমে যে পিক্সেল রঙ করতে হবে সেটি বের করব তারপর তার ৪টি প্রতিবেশী পিক্সেল চেক করব। যদি একই রঙের হয়, তবে নতুন রঙ দিয়ে রিপ্লেস করব এবং করেন্ট পিক্সেলের প্রতিবেশীদের সাথে রিপিট করব। যদি প্রতিবেশী পিক্সেল অন্য রঙের হয়, তবে সেটি বাদ দিব। এই ধাপগুলো অনুসরণ করব যতক্ষণ না শুরুর পিক্সেলের রঙের সব এডজেসেন্ট পিক্সেল রঙ হয়ে যায়। তারপর ফিলিং অ্যালগরিদম বন্ধ করব।
উদাহরণ
#include<iostream> using namespace std; #define M 8 #define N 8 void fillColorAdj(char screen[][N], int x, int y, char oldColor, char color){ if (x < 0 || x >= M || y < 0 || y >= N) return; if (screen[x][y] != oldColor) return; if (screen[x][y] == color) return; screen[x][y] = color; fillColorAdj(screen, x+1, y, oldColor, color); fillColorAdj(screen, x-1, y, oldColor, color); fillColorAdj(screen, x, y+1, oldColor, color); fillColorAdj(screen, x, y-1, oldColor, color); } void fillColor(char screen[][N], int x, int y, char color){ char oldColor = screen[x][y]; if(oldColor==color) return; fillColorAdj(screen, x, y, oldColor, color); } int main(){ char screen[M][N] = {{'W', 'W', 'B', 'W', 'W', 'W', 'W', 'W'}, {'W', 'W', 'W', 'W', 'W', 'W', 'B', 'B'}, {'W', 'B', 'B', 'W', 'W', 'B', 'W', 'W'}, {'W', 'Y', 'Y', 'Y', 'Y', 'B', 'W', 'B'}, {'B', 'W', 'W', 'Y', 'Y', 'B', 'W', 'B'}, {'B', 'W', 'W', 'Y', 'Y', 'Y', 'Y', 'B'}, {'W', 'B', 'W', 'W', 'W', 'Y', 'W', 'W'}, {'W', 'W', 'B', 'B', 'W', 'Y', 'Y', 'W'},}; int x = 5, y = 5; char color = 'R'; cout<<"The initial screen cordinates are : \n"; for (int i=0; i<M; i++){ for (int j=0; j<N; j++) cout<<screen[i][j]<<"\t"; cout<<endl; } fillColor(screen, x, y, color); cout<<"\nThe screen cordinates after coloring are : \n"; for (int i=0; i<M; i++){ for (int j=0; j<N; j++) cout<<screen[i][j]<<"\t"; cout<<endl; } }
আউটপুট
The initial screen cordinates are : W W B W W W W W W W W W W W B B W B B W W B W W W Y Y Y Y B W B B W W Y Y B W B B W W Y Y Y Y B W B W W W Y W W W W B B W Y Y W The screen cordinates after coloring are : W W B W W W W W W W W W W W B B W B B W W B W W W R R R R B W B B W W R R B W B B W W R R R R B W B W W W R W W W W B B W R R W