当前位置:   article > 正文

8.1 问题 D: 【递归入门】n皇后 问题(原始的8皇后问题)_每行输出一种方案,每种方案顺序输出皇后所在的列号,各个数之间有空格隔开。若无方

每行输出一种方案,每种方案顺序输出皇后所在的列号,各个数之间有空格隔开。若无方

题目描述

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

 

输入

一个整数n( 1 < = n < = 10 ) 

输出

每行输出对应一种方案,按字典序输出所有方案。每种方案顺序输出皇后所在的列号,相邻两数之间用空格隔开。如果一组可行方案都没有,输出“no solute!”

样例输入 Copy

4

样例输出 Copy

2 4 1 3
3 1 4 2
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. using namespace std;
  5. int n,a[20],ans,cnt,b[800][20];
  6. void dfs(int deep)
  7. {
  8. if(deep==n+1){
  9. ans++;
  10. for(int i=1;i<=n;i++) b[cnt][i]=a[i];
  11. cnt++;
  12. return;
  13. }
  14. for(int i=1;i<=n;i++){
  15. bool flag=true;///判断当前位置是否合法
  16. for(int j=1;j<deep;j++){
  17. if(a[j]==i||(deep-j)==abs(i-a[j])){
  18. flag=false;
  19. break;
  20. }
  21. }
  22. if(flag){//如果当先位置合法,则递归搜索下一个合法位置
  23. a[deep]=i;
  24. dfs(deep+1);
  25. }
  26. }
  27. return;
  28. }
  29. int main()
  30. {
  31. while(scanf("%d",&n)!=EOF){
  32. cnt=0;
  33. ans=0;
  34. dfs(1);
  35. if(ans==0) printf("no solute!\n");
  36. else{
  37. for(int i=0;i<cnt;i++){
  38. for(int j=1;j<=n;j++){
  39. printf("%d ",b[i][j]);
  40. }
  41. printf("\n");
  42. }
  43. }
  44. }
  45. return 0;
  46. }

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号