skdbf
2015-03-20 21:00:16
八皇后问题java代码算法解法
八皇后问题
是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后。为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当 n = 1 或 n ≥ 4 时问题有解。
解的个数
下表给出了 n 皇后问题的解的个数包括独立解U(OEIS中的数列A002562)以及互不相同的解D(OEIS中的数列A000170)的个数:
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ... | 26 |
U | 1 | 0 | 0 | 1 | 2 | 1 | 6 | ... | 2,789,712,466,510,289 |
D | 1 | 0 | 0 | 2 | 10 | 4 | 40 | ... | 22,317,699,616,364,044 |
下面的代码都有注释:
Queen.java
package package1; public class Queen{ private int x,y; Queen(int x,int y){ this.x=x; this.y=y; } int getX(){ return x; } int getY(){ return y; } void setX(int x){ this.x = x; } void setY(int y){ this.y = y; } boolean isAttack(Queen m, Queen n){ //判断是否相互攻击 int x1 = m.getX(); int x2 = n.getX(); int y1 = m.getY(); int y2 = n.getY(); if(y1==y2||y1-y2==x1-x2||y1-y2==x2-x1){ return true; } return false; } boolean isFine(Queen[] q){ for(int i=0; i<this.x;i++){ if(isAttack(this,q[i])){ //之前所有的数组元素和这时的数组元素之间判断是否攻击 return false; } } return true; } }
Resolve.java
package package1; import javax.swing.JOptionPane; public class Resolve { static int count=0; static int N; public static Queen[] setQueen(Queen[] q,int i){ if(i>N-1){ printQueen(q); count++; return q; } for(int j=0;j<N;j++){ //用j来控制列 q[i]=new Queen(i,j); if(q[i].isFine(q)) //判断(i,j)坐标的这个数组元素是否能成为皇后的点 if(setQueen(q,i+1)==null) continue; } return null; } public static void printQueen(Queen[]q){ //打印出符合条件的坐标 for(int i=0;i<N;i++){ System.out.print("( "+i+" , "+q[i].getY()+" )"); } System.out.println(); } public static void main(String[] args){ String str = JOptionPane.showInputDialog(null,"please enter the number of Queens","N Queens", JOptionPane.QUESTION_MESSAGE); N = Integer.parseInt(str); Queen []q = new Queen[N]; setQueen(q,0); System.out.println("解的总数为"+count); } }
猜你喜欢
请下载代码后再发表评论
相关代码
最近下载
最近浏览
luisfabiano LV2
2022年4月2日
蔡 LV10
2021年6月12日
yjl19991127 LV2
2021年5月8日
2196316269 LV10
2021年2月24日
xmjying LV13
2020年6月10日
wzy200 LV1
2020年6月5日
1548602858 LV4
2020年6月4日
19960721 LV9
2020年3月31日
luohaipeng LV23
2019年12月6日
lieber LV10
2018年12月4日