java皇后问题代码 java n皇后问题( 三 )


//判断第n个皇后是否与前面皇后形成攻击
ct = 1;
for(j = 0; jn; j ++)
{
if(location[j] == location[n])//形成攻击
{
ct = 0;
}else if(Math.abs(location[j] - location[n]) == (n - j))//形成攻击的
{
ct = 0;
}
}
if(ct == 1)//没有冲突,就开始下一列的试探
{
EightQueen(n+1);//递归调用
}
}
}
public static void main(String[] args)
{
System.out.printf("八皇后问题求解!\n");
System.out.printf("八皇后排列方式:\n");
EightQueen(0);
}
}
八皇后问题的java代码 。boolean[] diagonal = new boolean[16]; // 对角线安全标志
boolean[] undiagonal = new boolean[16]; // 反对角线安全标志
用上两个判断是否能放置棋子
在 n 行 n 列的国际象棋棋盘上,最多可布n个皇后 。
若两个皇后位于同一行、同一列、同一对角线上 , 
则称为它们为互相攻击 。
n皇后问题是指找到这 n 个皇后的互不攻击的布局 。
n 行 n 列的棋盘上,主次对角线各有2n-1条 。
利用行号i和列号j计算
主对角线编号k的方法是k = n+i-j-1;
计算次对角线编号k的方法是k = i+j
你主要是算法有些模糊罢了,现在我怕我说的不好将你弄的越来越混乱所以给你个叫形象的若是还不明白,call me
package 百度;
//演示程序:n个皇后问题
import java.io.*;
/*
在 n 行 n 列的国际象棋棋盘上,最多可布n个皇后 。
若两个皇后位于同一行、同一列、同一对角线上,
则称为它们为互相攻击 。
n皇后问题是指找到这 n 个皇后的互不攻击的布局 。
n 行 n 列的棋盘上,主次对角线各有2n-1条 。
利用行号i和列号j计算
主对角线编号k的方法是k = n+i-j-1;
计算次对角线编号k的方法是k = i+j
*/
//"n个皇后问题"之类定义
public class cQueen {
int n;//皇后问题的大小
int col[]; //数组,各列上有无皇后(0 , 1)
int md[];//数组,各主对角线有无皇后(0 , 1)
int sd[];//数组 , 各次对角线有无皇后(0,1)
int q[];//数组,第i行上皇后在第几列(0,n-1)
int Q;//已布皇后数,计数
int r;//n皇后问题的解的组数
//构造函数 n皇后问题的初始化
public cQueen(int m) {
n=m;Q=0;r=0;
col=new int[n];
md=new int[2*n-1];//初始化0
sd=new int[2*n-1];
q=new int[n];
}
//函数:打印棋盘
public void showBoard() {
int i,j;
for(i=0;in;i++) {
for(j=0;jn;j++)
if(q[i]==j) System.out.print("1 ");
else System.out.print("0 ");
System.out.println();
}
r++; //解的组数
System.out.println("---------------");
}
//求解n皇后问题
/*
此函数试图在n*n的棋盘的第i行上放一个皇后,
若找到可以放的位置,就递归调用自身试图在i+1行
放另一个皇后,若第i行是最后一行,则打印棋盘 。
*/
public void resolve(int i) {
int j;
// 在第i行给定后检查棋盘上的每一列
for(j=0;jn;j++) {
//如果在第i行的第j列可以布放皇后
if(col[j]==0md[n+i-j-1]==0sd[i+j]==0){
Q++;q[i]=j; //布放皇后,第i行皇后在第几列
// 标记新布皇后的攻击范围
col[j]=md[n+i-j-1]=sd[i+j]=1;
// 如果已经布了n个皇后(得到了一组解),
// 把棋盘(解)打印出来 。
if(Q==n) showBoard();
// 否则,递归 。在第i行第j列布放皇后的前提下,
//试探下一行(i+1行)在哪一列布皇后?
else if(in-1) resolve(i+1);

推荐阅读