ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

n皇后 问题(原始的8皇后问题)dfs

2021-03-14 09:33:47  阅读:147  来源: 互联网

标签:输出 int dfs 问题 boolean static new 皇后


题目描述

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

输入

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

输出

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

样例输入 Copy

4

样例输出 Copy

2 4 1 3
3 1 4 2

思路:
我是按照元素一个个枚举 dfs每个元素的坐标 然后统计放入皇后的个数 当个数达到要求 就输出方案
如何实现每个皇后之间不能相互攻击 我是通过设置四个判重数组 row,col,ud,udg,这四个数组分别对应元素的行,列,正对角和逆对角是否有元素

 1 public class 八皇后 {
 2     static final int N=11;
 3     static int n;
 4     static int q[][]=new int[N][N];
 5     static boolean row[]=new boolean[N];
 6     static boolean col[]=new boolean[N];
 7     static boolean dg[]=new boolean[N]; //正对角线
 8     static boolean udg[]=new boolean[N]; //反对角
 9       public static void main(String[] args) {
10         Scanner sc=new Scanner(System.in);
11         n=sc.nextInt();
12         dfs(1,1,0);//x y一个个遍历 按照元素一个个枚举
13     }
14       static void dfs(int x,int y,int cnt){ //x和y是每次遍历放皇后的位置 cnt统计放的次数
15           if(y>n){ //当y到了边界的时候 行加一 列重置
16               x++;
17               y=1;
18           }
19           if(x>n){ //x>n表示已经统计完
20           if(cnt==n){ //表示有成功放置的情况
21               for(int i=1;i<=n;i++){
22                   for(int j=1;j<=n;j++){
23                       if(q[i][j]==1) System.out.printf("%d ",j);
24                   }
25               }
26               System.out.println();
27            }
28           return;  //栈溢出看了半天 源赖氏return放在了第二个if语句里
29           }
30             //放皇后
31             if(!col[y] && !row[x] && !dg[y-x+n] && !udg[y+x]){
32                 q[x][y]=1;
33                 col[y]=row[x]=dg[y-x+n]=udg[x+y]=true;
34                 dfs(x,y+1,cnt+1);
35                 //恢复现场
36                 col[y]=row[x]=dg[y-x+n]=udg[x+y]=false;
37                 q[x][y]=0;
38             }
39           //不放皇后
40             dfs(x,y+1,cnt);
41       }
42 }

 

 

标签:输出,int,dfs,问题,boolean,static,new,皇后
来源: https://www.cnblogs.com/w12312/p/14531479.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有