8 Queen Problem
八皇后問題
在 8 * 8 的棋盤上擺入八個皇后,兩兩之間不能在同一行、同一列或對角線上, 求出共幾種解法並印出。
思路
可利用遞迴方式解決,每次放一個新的都與前面作比較,檢驗是否合格。
在 8 * 8 的棋盤上擺入八個皇后,兩兩之間不能在同一行、同一列或對角線上, 求出共幾種解法並印出。
思路
可利用遞迴方式解決,每次放一個新的都與前面作比較,檢驗是否合格。
#include<iostream> #include<conio.h> // getch() #include<cmath> using namespace std; #define max 8 int answer = 0; // 放外面 因為會一直累加 class QueenPuzzle { int queens[max]; public: void print(); void place(int i); // 放入 int isValid(int n); // 放入第 n 個是否合格 }; void QueenPuzzle::print() { for(int i = 0; i < max; i++) { for(int j = 0; j < max; j++) { if(j == queens[i]) cout << "Q "; else cout << "1 "; } cout << endl; // 排完一列 換行 } if(getch() == 'q') // 按 q 鍵正常退出 exit(0); } void QueenPuzzle::place(int i) { for(int j = 0; j < max; j++) { if(i == max) { answer++; cout << "第 " << answer << " 組解: " << endl; print(); return; } queens[i] = j; if(isValid(i)) // 成功 下面一位 如果不行 就回到迴圈 j++ 往右一格 place(i+1); } } int QueenPuzzle::isValid(int n) { for(int i = 0; i < n; i++) // 和前面幾個作比較 { if(queens[i] == queens[n]) // 同一列 return 0; if(abs(queens[n] - queens[i]) == n - i) // 在對角線上 return 0; } return 1; } int main(void) { QueenPuzzle puzzle; puzzle.place(0); cout << "共 " << answer << " 組解 " << endl; }
留言
張貼留言