递归---n皇后问题

蔚落 2023-06-25 05:00 60阅读 0赞

题目描述:

在 n x n 的棋盘上面所有的皇后不能相互攻击,即所有的皇后 既不在同一行、不在同一列,也不在同一对角线,如下图所示(以 4 x 4 的棋盘举例):
在这里插入图片描述 在这里插入图片描述
但是要求求出 n x n 的棋盘上所有排法

输入:

n(皇后个数,代表 n x n 的棋盘)

输出:

第一行:皇后的第一种排法(共 n 个元素,每个元素代表皇后 每行摆放的列数)

第 k 行:皇后的第 k 种排法

Sample Input

  1. 4

Sample Output

  1. 2413
  2. 3142

代码:

  1. #include<iostream>
  2. #include<cmath>
  3. #define _for(a,b,c) for(int a=b;a<c;a++)
  4. using namespace std;
  5. int line[100]; //皇后所在列数
  6. int n; //皇后个数
  7. void output(int n) //输出 n 皇后的一种排法
  8. {
  9. _for(i,1,n+1) cout << line[i];
  10. cout << endl;
  11. }
  12. int place(int m,int i) //判断第 m 行皇后能否放在第 i 列
  13. {
  14. _for(j,1,m) if(i == line[j] || abs(m-j) == abs(i - line[j])) return 0; //每行都试一遍,若结果不可行,则返回 0
  15. return 1; //结果可行,则返回 1
  16. }
  17. void nqueen(int m) //求第 m 行皇后放置的位置(前提是前 m-1 行皇后已经摆放完毕)
  18. {
  19. _for(i,1,n+1)
  20. {
  21. line[m] = i; //从第一个位置开始试
  22. if (place(m,i)) //判断第 m 行皇后能否放在第 i 列
  23. {
  24. if (m == n) output(n); //如果最后一个皇后也放置完毕,则输出结果
  25. else nqueen(m + 1); //否则,进行下一个皇后的放置
  26. }
  27. }
  28. //return
  29. }
  30. int main()
  31. {
  32. cin >> n;
  33. nqueen(1); //求第 m 行皇后放置的位置
  34. return 0;
  35. }

发表评论

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

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

相关阅读

    相关 ---n皇后问题

    题目描述: 在 n x n 的棋盘上面所有的皇后不能相互攻击,即所有的皇后 既不在同一行、不在同一列,也不在同一对角线,如下图所示(以 4 x 4 的棋盘举例): !

    相关 归入门】n皇后 问题

    题目描述 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。 如何将8个皇后放在棋盘上(有8 8个方格),使它们谁也不能被吃掉!这就