八皇后问题(回溯法)

小灰灰 2022-06-05 12:20 276阅读 0赞

问题描述

70

在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上(与水平行轴成45°或135°),问有多少种摆放方案?

思路

从第一行第一列开始,

1)考虑当前第row行第col列这个位置,要判断当前位置是否可存放

2)若不可存放则考虑这一行的下一列,返回1)

3)若可存放,则记录。然后判断当前是否为最后一行,是则说明找到一种方案并输出

3)若不是最后一行,则考虑下一行,返回1),直到判断完所有的方案

仔细分析可知,要实现所有方案的判断,就应该需要回溯地一层一层地判断,这里借用递归的方法来实现回溯的过程。

具体判断位置和输出方案的做法见代码。

  1. #include<iostream>
  2. using namespace std;
  3. static int QueenLocation[8] = { 0 }; //QueenLocation[i]=j 表示第i行皇后的位置在第j列
  4. static int gCount = 0; //记录所有方案数目
  5. void print() //输出一种可行方案
  6. {
  7. for (int row = 0; row < 8; row++)
  8. {
  9. for (int col = 0; col < QueenLocation[row]; col++)
  10. cout << "0";
  11. cout <<"#";
  12. for (col = QueenLocation[row] + 1; col < 8; col++)
  13. cout << "0";
  14. cout << endl;
  15. }
  16. cout << "==========================\n";
  17. }
  18. int check_pos_valid(int row, int col) //检查该位置是否可存放
  19. {
  20. int location;
  21. for (int i = 0; i < row; i++) //已存放的皇后对第row行第col列这个位置的影响
  22. {
  23. location = QueenLocation[i];
  24. if (col == location)
  25. return 0; //同列
  26. if ((i + location) == (row + col) ||
  27. (i - location) == (row - col))
  28. return 0; //同一斜线(135°或者45°)
  29. //注意,由于是递归地每一行考虑,不会出现同行的情况
  30. }
  31. return 1; //可存放
  32. }
  33. void eight_queen(int row) //考虑第row行皇后的存放
  34. {
  35. for (int col = 0; col < 8; col++) //考虑第row行第col列是否可存放
  36. {
  37. if (check_pos_valid(row, col)) //返回1表示该位置可存放
  38. {
  39. QueenLocation[row] = col; //在第row行第col列置放一个皇后
  40. if (7 == row) //找到一个完整的方案
  41. {
  42. gCount++; print(); //记数并输出这个方案
  43. QueenLocation[row] = 0;
  44. return; //开始回溯
  45. }
  46. eight_queen(row + 1); //递归地考虑下一行
  47. QueenLocation[row] = 0; //初始化该值以不影响回溯时的判断
  48. }
  49. }
  50. }
  51. int main(int argc, char*argv[])
  52. {
  53. eight_queen(0);
  54. cout << "total=" << gCount << endl;
  55. return 0;
  56. }

本文借鉴于百度百科。

发表评论

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

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

相关阅读

    相关 回溯-N皇后问题

    一、N皇后问题 n皇后问题:要求在一个n×n的棋盘上放置n个皇后,使得任意两个皇后不在同一行或同一列或同一斜线上。 二、回溯法 回溯法是一类非常重要的算法设计方法

    相关 回溯皇后问题

    八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横

    相关 皇后问题(回溯)

    问题描述: 在8\8的棋盘上,放置8个皇后,使他们互相不攻击; 解析: 进行逐行放置,皇后肯定不会进行横向攻击,因此只需检查纵向和斜向是否会进行攻击即可 代码:  C

    相关 皇后问题回溯

    问题描述 ![70][] 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上(与水平行轴成45°或135°),问有多少

    相关 回溯皇后

    回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再

    相关 回溯—— / N 皇后问题

    回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。 回溯法在问题的解空间树中,按深度优先策略,从根结点