八皇后问题 ( C++ ) ( 递归 )

梦里梦外; 2022-05-21 10:11 266阅读 0赞
  1. #include<iostream> //八皇后问题递归方法
  2. using namespace std;
  3. int ways = 0;
  4. int a[8] = { -1,-1,-1,-1,-1,-1,-1,-1 };
  5. bool check(int row, int col) { // 在row行,col列可以放置皇后吗?
  6. for (int i = 0; i < row; i++) // 判断同列、对角线是否有皇后冲突
  7. if (a[i] == col || row - i == col - a[i] || row - i == a[i] - col)
  8. return false; // 返回0表示不能放,有冲突
  9. return true;
  10. }
  11. void place(int n) {
  12. if (n == 8) { // 递归函数的出口,从0到7行都已经放置完毕,
  13. ways++; // 并且都是正确的,所以当n=8的时候,方案数加1
  14. for (int i = 0; i < 8; i++)
  15. cout << a[i] << " "; // 输出结果
  16. cout << "\n-----------------------\n";
  17. return;
  18. }
  19. else {
  20. for (int i = 0; i < 8; i++)
  21. if (check(n, i)) {
  22. a[n] = i; // 如果该行可以放的话,就放
  23. place(n + 1); // 放好之后,放下一行
  24. } // 如果后几行全放完了,或者下一行没地方放,
  25. // 就返回这一层for循环,重新把这一行往下一列放,此处就是回溯
  26. }
  27. }
  28. int main() {
  29. place(0); cout << ways << endl;
  30. return 0;
  31. }

发表评论

表情:
评论列表 (有 0 条评论,266人围观)

还没有评论,来说两句吧...

相关阅读

    相关 --皇后

      八皇后这个典的问题,是每个真正程序员必须经历过的。这也是我第二次来解决这个问题了,第一次应该是学数据结构那时候吧。这次写起来顺利多了,基本没遇到什么卡壳的地方。递归+回溯。