n-皇后问题

举报
irrational 发表于 2022/01/17 23:10:29 2022/01/17
【摘要】 n−皇后问题是指将 n 个皇后放在 n×n的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n,请你输出所有的满足条件的棋子摆法。 输入格式 共一行,包含整数 n。 输出格式 每个解决方案占 n行,每行输出一个长度为 n的字符串,用来表示完整的棋盘状态。 其中 ...

n−皇后问题是指将 n 个皇后放在 n×n的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

1_597ec77c49-8-queens.png

现在给定整数 n,请你输出所有的满足条件的棋子摆法。

输入格式

共一行,包含整数 n。

输出格式

每个解决方案占 n行,每行输出一个长度为 n的字符串,用来表示完整的棋盘状态。

其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。

每个方案输出完成后,输出一个空行。

注意:行末不能有多余空格。

输出方案的顺序任意,只要不重复且没有遗漏即可。

数据范围

1≤n≤9

输入样例:

4

 

输出样例:


  
  1. .Q..
  2. ...Q
  3. Q...
  4. ..Q.
  5. ..Q.
  6. Q...
  7. ...Q
  8. .Q..

思路一:

米字攻击法+回溯 dfs+剪枝

u是列数,一列一列摆棋子。


  
  1. #include <iostream>
  2. using namespace std;
  3. const int N = 20;
  4. int n;
  5. char g[N][N];
  6. bool col[N], dg[N], udg[N];
  7. void dfs(int u)
  8. {
  9. if (u == n)
  10. {
  11. for (int i = 0; i < n; i ++ ) puts(g[i]);
  12. puts("");
  13. return;
  14. }
  15. for (int i = 0; i < n; i ++ )
  16. if (!col[i] && !dg[u + i] && !udg[n - u + i])
  17. {
  18. g[u][i] = 'Q';
  19. col[i] = dg[u + i] = udg[n - u + i] = true;
  20. dfs(u + 1);
  21. col[i] = dg[u + i] = udg[n - u + i] = false;
  22. g[u][i] = '.';
  23. }
  24. }
  25. int main()
  26. {
  27. cin >> n;
  28. for (int i = 0; i < n; i ++ )
  29. for (int j = 0; j < n; j ++ )
  30. g[i][j] = '.';
  31. dfs(0);
  32. return 0;
  33. }

方法二:

一种更加朴素的搜索顺序,直接挨个挨个两种情况讨论即可,仍旧是从上往下一直摆,出了错误就回溯。


  
  1. #include <iostream>
  2. using namespace std;
  3. const int N = 10;
  4. int n;
  5. bool row[N], col[N], dg[N * 2], udg[N * 2];
  6. char g[N][N];
  7. void dfs(int x, int y, int s)
  8. {
  9. if (s > n) return;
  10. if (y == n) y = 0, x ++ ;
  11. if (x == n)
  12. {
  13. if (s == n)
  14. {
  15. for (int i = 0; i < n; i ++ ) puts(g[i]);
  16. puts("");
  17. }
  18. return;
  19. }
  20. g[x][y] = '.';
  21. dfs(x, y + 1, s);
  22. if (!row[x] && !col[y] && !dg[x + y] && !udg[x - y + n])
  23. {
  24. row[x] = col[y] = dg[x + y] = udg[x - y + n] = true;
  25. g[x][y] = 'Q';
  26. dfs(x, y + 1, s + 1);
  27. g[x][y] = '.';
  28. row[x] = col[y] = dg[x + y] = udg[x - y + n] = false;
  29. }
  30. }
  31. int main()
  32. {
  33. cin >> n;
  34. dfs(0, 0, 0);
  35. return 0;
  36. }

文章来源: blog.csdn.net,作者:irrationality,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_54227557/article/details/120606365

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。