8 Queen Problem

八皇后問題
在 8 * 8 的棋盤上擺入八個皇后,兩兩之間不能在同一行、同一列或對角線上, 求出共幾種解法並印出。

思路
可利用遞迴方式解決,每次放一個新的都與前面作比較,檢驗是否合格。

  1. #include<iostream>
  2. #include<conio.h> // getch()
  3. #include<cmath>
  4. using namespace std;
  5.  
  6. #define max 8
  7. int answer = 0; // 放外面 因為會一直累加
  8.  
  9. class QueenPuzzle
  10. {
  11. int queens[max];
  12. public:
  13. void print();
  14. void place(int i); // 放入
  15. int isValid(int n); // 放入第 n 個是否合格
  16. };
  17.  
  18. void QueenPuzzle::print()
  19. {
  20. for(int i = 0; i < max; i++)
  21. {
  22. for(int j = 0; j < max; j++)
  23. {
  24. if(j == queens[i])
  25. cout << "Q ";
  26. else
  27. cout << "1 ";
  28. }
  29. cout << endl; // 排完一列 換行
  30. }
  31. if(getch() == 'q') // 按 q 鍵正常退出
  32. exit(0);
  33. }
  34.  
  35. void QueenPuzzle::place(int i)
  36. {
  37. for(int j = 0; j < max; j++)
  38. {
  39. if(i == max)
  40. {
  41. answer++;
  42. cout << "第 " << answer << " 組解: " << endl;
  43. print();
  44. return;
  45. }
  46. queens[i] = j;
  47. if(isValid(i)) // 成功 下面一位 如果不行 就回到迴圈 j++ 往右一格
  48. place(i+1);
  49. }
  50. }
  51.  
  52. int QueenPuzzle::isValid(int n)
  53. {
  54. for(int i = 0; i < n; i++) // 和前面幾個作比較
  55. {
  56. if(queens[i] == queens[n]) // 同一列
  57. return 0;
  58. if(abs(queens[n] - queens[i]) == n - i) // 在對角線上
  59. return 0;
  60. }
  61. return 1;
  62. }
  63.  
  64. int main(void)
  65. {
  66. QueenPuzzle puzzle;
  67. puzzle.place(0);
  68. cout << "共 " << answer << " 組解 " << endl;
  69. }

留言

這個網誌中的熱門文章

機率筆記 (1)

離散數學筆記 — vertex cut

機率筆記 (4) — 隨機變數