八皇后问题java代码 八皇后问题详解最短代码

java:八皇后问题解题思路递归:
首先每一行放置均会循环,也就是每一行的皇后都会被依次放置在8个位置上;
1)第一行在第一个位置上放置1枚皇后;
2)第二行在第一个位置上放置皇后,如果与已有的皇后不在一条直线上 , 则进入下一行,否则位置+1;
3)余下几行均依照步骤2)的方法进行放置,当最后一行放置好,打印输出;
可以写个函数,EightQueen(int
n,
int
*Pos),其中n表示第几行,Pos指向一个数组,Pos[i]=j表示第i行的位置是j;EightQueen(int
n,
int
*Pos)从n=1开始递归,到n=8递归结束 。
代码就不写了 , 没写过java , 写不来
八皇后问题的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列布放皇后的前提下,

推荐阅读