8皇后问题回溯法

╰+哭是因爲堅強的太久メ 2022-05-30 11:13 363阅读 0赞
  1. 1,每一行都必须放一个黑皇后、一个白皇后。
  2. 2,从第一行到最后一行,先把黑皇后放好,再放白皇后。(当然不只这种放法)
  3. 3,放的时候注意的是0的地方不能放,放过的地方不能放。
  4. (本以为是在N皇后基础上直接是有序选两个的总和,并不是:不同放法可能有相同的使用点)
  5. */
  6. #include<iostream>
  7. using namespace std;
  8. int s[13][13];
  9. int n;
  10. int count=0;
  11. void dfs(int i,int q)
  12. {
  13. for(int j=0;j<n;j++)
  14. {
  15. //不能放的或者已经放过的
  16. if(s[i][j]==0||s[i][j]==2)
  17. {
  18. continue;
  19. }
  20. int flag=1;//默认可以放
  21. int y1=j-1;
  22. int y2=j+1;
  23. for(int l=i-1;l>=0;l--)
  24. {
  25. //判断同一列、斜线上是否有相同皇后(同行肯定不会有:从上到下进行的)
  26. //同一列
  27. if(s[l][j]==q)
  28. {
  29. flag=0;
  30. break;
  31. }
  32. //斜线
  33. if(y1>=0&&s[l][y1]==q)
  34. {
  35. flag=0;
  36. break;
  37. }
  38. y1--;
  39. if(y2<n&&s[l][y2]==q)
  40. {
  41. flag=0;
  42. break;
  43. }
  44. y2++;
  45. }
  46. if(flag)
  47. {
  48. s[i][j]=q;//放皇后
  49. if(i<n-1)
  50. {
  51. dfs(i+1,q);
  52. }
  53. else
  54. {
  55. //黑皇后放完了,开始放白皇后;
  56. //白皇后放完的话就是一种方法结束
  57. if(q==2)
  58. {
  59. dfs(0,3);
  60. }
  61. else
  62. {
  63. count++;
  64. }
  65. }
  66. s[i][j]=1;//复原开始下一次
  67. }
  68. }
  69. }
  70. int main()
  71. {
  72. cin>>n;
  73. for(int i=0;i<n;i++)
  74. {
  75. for(int j=0;j<n;j++)
  76. {
  77. cin>>s[i][j];
  78. }
  79. }
  80. dfs(0,2);//黑皇后
  81. cout<<count<<endl;
  82. return 0;
  83. }

发表评论

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

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

相关阅读

    相关 回溯-N皇后问题

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

    相关 回溯:八皇后问题

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

    相关 皇后问题(回溯)

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

    相关 皇后问题回溯

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

    相关 回溯(八皇后

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

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

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