ধরুন আমরা প্রদত্ত চিত্রের আটটি বৃত্তের মধ্যে 1, 2, 3, 4, 5, 6, 7, 8 রাখতে চাই, এভাবে যে ক্রমানুসারে এর পাশে থাকা একটি সংখ্যার সংলগ্ন কোনো সংখ্যা নেই।
সুতরাং, যদি ইনপুট মত হয়
0 | - 1 | - 1 | 0 |
- 1 | - 1 | - 1 | - 1 |
0 | - 1 | - 1 | 0 |
তাহলে আউটপুট হবে
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- N :=3, M :=4
- বিবেচিত নয় :=-1
- একটি ফাংশন সংজ্ঞায়িত করুন present_in_grid(), এটি গ্রিড নেবে[N][M], সংখ্যা,
- আরম্ভ করার জন্য i :=0, যখন i
- আরম্ভ করার জন্য j :=0, যখন j
করুন - যদি গ্রিড[i, j] সংখ্যার সমান হয়, তাহলে −
- সত্যে ফিরে আসুন
- আরম্ভ করার জন্য j :=0, যখন j
- যদি present_in_grid(গ্রিড, num) অথবা |num - grid[row, col + 1]| <=1 বা |সংখ্যা - গ্রিড[সারি + 1, কল]| <=1 বা |সংখ্যা - গ্রিড[সারি + 1, কল - 1]| <=1 বা |সংখ্যা - গ্রিড[সারি + 1, কল + 1]| <=1, তারপর −
- মিথ্যে ফেরত দিন
- যদি present_in_grid(গ্রিড, num) অথবা |num - grid[row, col - 1]| <=1 বা |সংখ্যা - গ্রিড[সারি + 1, কল]| <=1 বা |সংখ্যা - গ্রিড[সারি + 1, কল + 1]| <=1 বা |সংখ্যা - গ্রিড[সারি + 1, কল - 1]| <=1, তারপর −
- মিথ্যে ফেরত দিন
- যদি present_in_grid(গ্রিড, num) অথবা |num - grid[row - 1, col + 1]| <=1 বা |সংখ্যা - গ্রিড[সারি, কল + 1]| <=1 বা |সংখ্যা - গ্রিড[সারি + 1, কল + 1]| <=1, তারপর −
- মিথ্যে ফেরত দিন
- যদি present_in_grid(গ্রিড, num) অথবা |num - grid[সারি - 1, col - 1]| <=1 বা |সংখ্যা - গ্রিড[সারি, কল - 1]| <=1 বা |সংখ্যা - গ্রিড[সারি + 1, কল - 1]| <=1, তারপর −
- মিথ্যে ফেরত দিন
- যদি present_in_grid(গ্রিড, num) অথবা |num - grid[সারি - 1, col - 1]| <=1 বা |সংখ্যা - গ্রিড[সারি - 1, কল]| <=1 বা |সংখ্যা - গ্রিড[সারি - 1, কল + 1]| <=1 বা |সংখ্যা - গ্রিড[সারি, কল + 1]| <=1, তারপর −
- মিথ্যে ফেরত দিন
- যদি present_in_grid(গ্রিড, num) অথবা |num - grid[row, col - 1]| <=1 বা |সংখ্যা - গ্রিড[সারি - 1, কল]| <=1 বা |সংখ্যা - গ্রিড[সারি - 1, কল + 1]| <=1 বা |সংখ্যা - গ্রিড[সারি - 1, কল - 1]| <=1, তারপর −
- মিথ্যে ফেরত দিন
- যদি present_in_grid(গ্রিড, num) অথবা |num - grid[row, col - 1]| <=1 বা |সংখ্যা - গ্রিড[সারি - 1, কল]| <=1 বা |সংখ্যা - গ্রিড[সারি - 1, কল + 1]| <=1 বা |সংখ্যা - গ্রিড[সারি, কল + 1]| <=1 বা |সংখ্যা - গ্রিড[সারি + 1, কল + 1]| <=1 বা |সংখ্যা - গ্রিড[সারি + 1, কল]| <=1, তারপর −
- মিথ্যে ফেরত দিন
- যদি present_in_grid(গ্রিড, num) অথবা |num - grid[row, col - 1]| <=1 বা |সংখ্যা - গ্রিড[সারি - 1, কল]| <=1 বা |সংখ্যা - গ্রিড[সারি + 1, কল - 1]| <=1 বা |সংখ্যা - গ্রিড[সারি, কল + 1]| <=1 বা |সংখ্যা - গ্রিড[সারি - 1, কল - 1]| <=1 বা |সংখ্যা - গ্রিড[সারি + 1, কল]| 1, তারপর −
- মিথ্যে ফেরত দিন
- সারি শুরু করার জন্য :=0, যখন সারি
করুন - কল শুরু করার জন্য :=0, যখন col
- যদি গ্রিড[সারি, কল] বিবেচনা করা হয় না, তাহলে -
- সত্যে ফিরে আসুন
- কল শুরু করার জন্য :=0, যখন col
- সত্যে ফিরে আসুন
- যদি নিরাপদ (গ্রিড, সারি, কল, সংখ্যা), তাহলে −
- গ্রিড[সারি, কল] :=সংখ্যা
- যদি সমাধান(গ্রিড) সত্য হয়, তাহলে −
- সত্যে ফিরে আসুন
- গ্রিড[সারি, কল] :=বিবেচনা করা হয়নি
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
#include <cmath> #include <iostream> #define N 3 #define M 4 #define NOTCONSIDERED -1 using namespace std; bool present_in_grid(int grid[N][M], int num) { for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) if (grid[i][j] == num) return true; } return false; } bool isSafe(int grid[N][M], int row, int col, int num) { if (row == 0 && col == 1) { if (present_in_grid(grid, num) || (abs(num - grid[row][col + 1]) <= 1) || (abs(num - grid[row + 1][col]) <= 1) || (abs(num - grid[row + 1][col - 1]) <= 1) || (abs(num - grid[row + 1][col + 1]) <= 1)) return false; } else if (row == 0 && col == 2) { if (present_in_grid(grid, num) || (abs(num - grid[row][col - 1]) <= 1) || (abs(num - grid[row + 1][col]) <= 1) || (abs(num - grid[row + 1][col + 1]) <= 1) || (abs(num - grid[row + 1][col - 1]) <= 1)) return false; } else if (row == 1 && col == 0) { if (present_in_grid(grid, num) || (abs(num - grid[row - 1][col + 1]) <= 1) || (abs(num - grid[row][col + 1]) <= 1) || (abs(num - grid[row + 1][col + 1]) <= 1)) return false; } else if (row == 1 && col == 3) { if (present_in_grid(grid, num) || (abs(num - grid[row - 1][col - 1]) <= 1) || (abs(num - grid[row][col - 1]) <= 1) || (abs(num - grid[row + 1][col - 1]) <= 1)) return false; } else if (row == 2 && col == 1) { if (present_in_grid(grid, num) || (abs(num - grid[row - 1][col - 1]) <= 1) || (abs(num - grid[row - 1][col]) <= 1) || (abs(num - grid[row - 1][col + 1]) <= 1) || (abs(num - grid[row][col + 1]) <= 1)) return false; } else if (row == 2 && col == 2) { if (present_in_grid(grid, num) || (abs(num - grid[row][col - 1]) <= 1) || (abs(num - grid[row - 1][col]) <= 1) || (abs(num - grid[row - 1][col + 1]) <= 1) || (abs(num - grid[row - 1][col - 1]) <= 1)) return false; } else if (row == 1 && col == 1) { if (present_in_grid(grid, num) || (abs(num - grid[row][col - 1]) <= 1) || (abs(num - grid[row - 1][col]) <= 1) || (abs(num - grid[row - 1][col + 1]) <= 1) || (abs(num - grid[row][col + 1]) <= 1) || (abs(num - grid[row + 1][col + 1]) <= 1) || (abs(num - grid[row + 1][col]) <= 1)) return false; } else if (row == 1 && col == 2) { if (present_in_grid(grid, num) || (abs(num - grid[row][col - 1]) <= 1) || (abs(num - grid[row - 1][col]) <= 1) || (abs(num - grid[row + 1][col - 1]) <= 1) || (abs(num - grid[row][col + 1]) <= 1) || (abs(num - grid[row - 1][col - 1]) <= 1) || (abs(num - grid[row + 1][col]) <= 1)) return false; } return true; } bool search_free_location(int grid[N][M], int& row, int& col) { for (row = 0; row < N; row++) for (col = 0; col < M; col++) { if (grid[row][col] == NOTCONSIDERED) return true; } return false; } void show_res(int grid[N][M]) { for (int i = 0; i < N; i++) { if (i == 0 || i == N - 1) cout << " "; for (int j = 0; j < M; j++) { if (grid[i][j] == 0) cout << " "; else cout << grid[i][j] << " "; } cout << endl; } } bool Solve(int grid[N][M]) { int row, col; if (!search_free_location(grid, row, col)) return true; for (int num = 1; num <= 8; num++) { if (isSafe(grid, row, col, num)) { grid[row][col] = num; if (Solve(grid)) return true; grid[row][col] = NOTCONSIDERED; } } return false; } int main(){ int grid[N][M] = { { 0, -1, -1, 0 }, { -1, -1, -1, -1 }, { 0, -1, -1, 0 } }; if (Solve(grid)) show_res(grid); else cout << "Not possible"; }
ইনপুট
{ { 0, -1, -1, 0 }, { -1, -1, -1, -1}, { 0, -1, -1, 0 }}
আউটপুট
3 5 7 1 8 2 4 6