8皇后问题
来源:互联网 发布:网络运维 编辑:程序博客网 时间:2024/05/22 13:13
package 二〇一七年三月二十四日;import java.util.Date;public class 皇后问题 { /** * 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击, * 即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 * 下面使用递归方法解决 * @author newflydd@189.cn * */ private static final short N=8; //使用常量来定义,方便之后解N皇后问题 private static int count=0; //结果计数器 public static void main(String[] args) { Date begin =new Date(); //初始化棋盘,全部置0 short chess[][]=new short[N][N]; for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ chess[i][j]=0; } } putQueenAtRow(chess,0); Date end =new Date(); System.out.println("解决 " +N+ " 皇后问题,用时:" +String.valueOf(end.getTime()-begin.getTime())+ "毫秒,计算结果:"+count); } private static void putQueenAtRow(short[][] chess, int row) { /** * 递归终止判断:如果row==N,则说明已经成功摆放了8个皇后 * 输出结果,终止递归 */ if(row==N){ count++; System.out.println("第 "+ count +" 种解:"); for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ System.out.print(chess[i][j]+" "); } System.out.println(); } return; } short[][] chessTemp=chess.clone(); /** * 向这一行的每一个位置尝试排放皇后 * 然后检测状态,如果安全则继续执行递归函数摆放下一行皇后 */ for(int i=0;i<N;i++){ //摆放这一行的皇后,之前要清掉所有这一行摆放的记录,防止污染棋盘 for(int j=0;j<N;j++){ chessTemp[row][j]=0; chessTemp[row][i]=1; } if( isSafety( chessTemp,row,i ) ){ putQueenAtRow(chessTemp,row+1); } } } private static boolean isSafety(short[][] chess,int row,int col) { //判断中上、左上、右上是否安全 int step=1; while(row-step>=0){ if(chess[row-step][col]==1) //中上 return false; if(col-step>=0 && chess[row-step][col-step]==1) //左上 return false; if(col+step<N && chess[row-step][col+step]==1) //右上 return false; step++; } return true; }}
阅读全文
0 0
- 8皇后问题和N皇后问题
- 8皇后问题改进~
- 8皇后问题
- 8皇后问题求解
- 8皇后问题
- 8皇后问题
- 8皇后问题算法
- 8皇后问题
- 8皇后问题
- 8皇后问题
- 8皇后问题
- 8皇后问题
- 8皇后问题
- 8皇后问题
- 【算法】8皇后问题
- 8皇后问题续
- 8皇后问题算法
- 8皇后问题
- 提示Android requires compiler compliance level 5.0 or 6.0.&nb
- 网页制作HTML代码全攻略
- 蓝桥杯-调和级数
- 集成三方地图时如何获取SHA1值,以及keytool异常问题解决方法
- spring + springMVC声明式事务失效问题
- 8皇后问题
- Linux 最常用命令和知识汇总(含思维导图)
- Controller 方法的返回值
- java 判断中文是否乱码
- 蓝桥杯-今有7对数字
- qt从5.8.0降到5.5.1或者5.4.2-----给自己mark一下
- 安卓video层级怎么解决
- android 绘图方法
- 全排模板-java