কম্পিউটার টিউটোরিয়াল

ফ্লাড ফিল অ্যালগরিদম (Flood fill Algorithm)


একটি ম্যাট্রিক্স দেওয়া আছে; ম্যাট্রিক্সটি একটি স্ক্রিনকে রিপ্রেজেন্ট করে। স্ক্রিনের প্রতিটি এলিমেন্ট (i, j) একটি পিক্সেল হিসেবে চিহ্নিত, সেই পিক্সেলের রং ভিন্ন সংখ্যা দিয়ে চিহ্নিত। এই অ্যালগরিদমে, পিক্সেলগুলো নতুন রং দিয়ে ফিল হবে যখন সেটি ইতিমধ্যে নির্বাচিত পূর্বের রঙে থাকে। যদি পূর্বের রং না হয়, সেই পিক্সেল ফিল হবে না। একটি পিক্সেল ফিল করার পর, সেটি তার উপরে, নিচে, বামে এবং ডানের পিক্সেল চেক করবে একই কাজের জন্য।

আইডিয়াটি খুব সহজ, প্রথমে চেক করুন নির্বাচিত পজিশন পূর্বের রঙে রঙিন আছে কিনা, না হলে অ্যালগরিদম কাজ করবে না। অন্যথায়, সেটি নতুন রং দিয়ে সেই পিক্সেল ফিল করবে এবং তার চার প্রতিবেশীর জন্য রিকার্শন করবে।

ইনপুট এবং আউটপুট

ইনপুট: স্ক্রিন ম্যাট্রিক্স: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 0 1 1 1 2 2 2 2 0 1 0 1 1 1 2 2 0 1 0 1 1 1 2 2 2 2 0 1 1 1 1 1 2 1 1 1 1 1 1 1 2 2 1 আউটপুট: ফ্লাড ফিলের পর স্ক্রিন ম্যাট্রিক্স 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 0 1 1 1 3 3 3 3 0 1 0 1 1 1 3 3 0 1 0 1 1 1 3 3 3 3 0 1 1 1 1 1 3 1 1 1 1 1 1 1 3 3 1

অ্যালগরিদম

fillScreen(x, y, prevColor, newColor)

ইনপুট: শুরু করার (x,y) কোঅর্ডিনেট, পূর্বের রং, এবং নতুন রং।

আউটপুট - স্ক্রিন পূর্বের রং থেকে নতুন রংয় পরিবর্তন করার পর, যদি সম্ভব হয়।

শুরু 
  যদি (x, y) স্ক্রিন রেঞ্জে না থাকে, তবে 
    ফেরত দিন 
  যদি (x, y) এর রং ≠ prevColor, তবে 
    ফেরত দিন 
  screen[x, y] := newColor 
  fillScreen(x+1, y, prevColor, newColor) 
  fillScreen(x-1, y, prevColor, newColor) 
  fillScreen(x, y+1, prevColor, newColor) 
  fillScreen(x, y-1, prevColor, newColor) 
শেষ

উদাহরণ

#include<iostream> #define M 8 #define N 8 using namespace std; int screen[M][N] = {     //স্ক্রিনের মাত্রা এবং রং   {1, 1, 1, 1, 1, 1, 1, 1},   {1, 1, 1, 1, 1, 1, 0, 0},   {1, 0, 0, 1, 1, 0, 1, 1},   {1, 2, 2, 2, 2, 0, 1, 0},   {1, 1, 1, 2, 2, 0, 1, 0},   {1, 1, 1, 2, 2, 2, 2, 0},   {1, 1, 1, 1, 1, 2, 1, 1},   {1, 1, 1, 1, 1, 2, 2, 1} }; void fillScreen(int x, int y, int prevColor, int newColor) {   //(x,y)-এর পূর্বের রং নতুন রং দিয়ে রিপ্লেস করুন   if (x < 0 || x >= M || y < 0 || y >= N)     //যখন পয়েন্ট স্ক্রিন ছাড়ায় চলে যায়     return;   if (screen[x][y] != prevColor) //যদি পয়েন্ট(x,y) prevColor ধারণ করে না, কিছু করবেন না     return;   screen[x][y] = newColor;    //রং আপডেট করুন   fillScreen(x+1, y, prevColor, newColor);    //(x,y)-এর ডানের জন্য   fillScreen(x-1, y, prevColor, newColor);    //(x,y)-এর বামের জন্য   fillScreen(x, y+1, prevColor, newColor);    //(x,y)-এর উপরের জন্য   fillScreen(x, y-1, prevColor, newColor);    //(x,y)-এর নিচের জন্য } void floodFill(int x, int y, int newColor) {   int prevColor = screen[x][y];    //নতুন রং দিয়ে রিপ্লেস করার আগে রং নিন   fillScreen(x, y, prevColor, newColor); } int main() {   int x = 4, y = 4, newColor = 3;   cout << "Previous screen: "<< endl;   for (int i=0; i<M; i++) {     for (int j=0; j<N; j++)       cout << screen[i][j] << " ";     cout << endl;   }   cout << endl;   floodFill(x, y, newColor);    //(4, 4) থেকে শুরু, নতুন রং ৩ দিয়ে       cout << "Updated screen: "<< endl;   for (int i=0; i<M; i++) {     for (int j=0; j<N; j++)       cout << screen[i][j] << " ";     cout << endl;   } }

আউটপুট

Previous screen 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 0 1 1 1 2 2 2 2 0 1 0 1 1 1 2 2 0 1 0 1 1 1 2 2 2 2 0 1 1 1 1 1 2 1 1 1 1 1 1 1 2 2 1 Updated screen: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 0 1 1 1 3 3 3 3 0 1 0 1 1 1 3 3 0 1 0 1 1 1 3 3 3 3 0 1 1 1 1 1 3 1 1 1 1 1 1 1 3 3 1

  1. ফোর্ড-ফুলকারসন অ্যালগরিদম (Ford-Fulkerson Algorithm)

  2. ফ্লয়েড-ওয়ারশাল অ্যালগরিদম (সর্বোচ্চ ছোট পথ)

  3. C গ্রাফিক্স-এ ফ্লাড ফিল অ্যালগরিদম ব্যবহার

  4. ডেটা স্ট্রাকচরে অ্যালগরিদম স্পেসিফিকেশন-পরিচয়