您的位置:首页 > 编程语言 > Java开发

八皇后问题,Java实现,可推广解决N皇后问题

2015-04-06 14:35 411 查看
八皇后问题是一个经典的回溯算法的问题。
八皇后问题说的是:国际象棋棋盘有8行8列,即8*8=64个单元格,现在在棋盘上排放八个皇后,使其不能互相攻击,就是说任意两个皇后都不能处于同行同列,或同一斜线上。问有多少钟摆法,摆放的方式为?N=8,(N>=4);
算法思路:棋盘可用二维数组构成,因为任意皇后不在同行,我们用一个一维数组position
,来保存每一行皇后的位置,就可避免在同一行。
具体流程如下:
1、首先在第一行某个位置放一个皇后;
2、接着在下一行放置第二个皇后,此时要逻辑判断是否与前面的皇后形成攻击,若不形成攻击则放置下一个皇后。
3、当放置完N个不形成攻击的皇后,就找到一个解,将其输出


下面给出完整代码:

public class Queen {
static  int N = 8;
static int count = 0;
static int[] position = new int
;

static void outPut(){
int i, j;
System.out.println("第"+(++count)+"种方法输出:");
for(i=0; i<N; i++){
for(j=0; j<N; j++){
if(position[i] == j){
System.out.print("0 "); //0代表皇后
}else{
System.out.print("* ");
}
}
System.out.println();
}
}

static void eightQueen(int n){
int i, j;
int ct;
if(n == N){
outPut();
return;
}
for(i=0; i<N; i++){
position
= i; //n代表第n行,i代表第n行皇后的位置
ct = 1;
for(j=0; j<n; j++){
//第一个判断是否在同一列,第二个判断是否在正反斜线上
if(position
==position[j] || Math.abs(position[j]-position
)==(n-j))
ct = 0;
}
if(ct == 1) //如果没有冲突,则向下一行递归
eightQueen(n+1);
//这是向下一行递归,如果递归的结果是下一行的皇后无地方放,则回溯到n,i++一次,即本次第n行的皇后位置向后移一位
}
}

public static void main(String[] args) {
System.out.println("请输入皇后N的个数:");
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
System.out.println(N+"皇后的放置方法有:");
eightQueen(0);
}
}


运行其中之一的结果为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: