java八皇后代码 python八皇后代码

java八皇后问题希望我解释的你能明白:
把棋盘看成二维方阵,行从上到下编号0-7(就是i),列从左到右编号0-7(就是j),这样棋盘上每个点都可以表示为(i,j)
从键盘的右上角(0,7)到左下角(7,0)的对角线,以及这条线的平行线,就是反对角线,也就是这个程序里的undiagonal 。显然这个反对角线上任意2点(i1,j1)和(i2,j2)都满足i1+j1=i2+j2.因为i+j可能的取值范围是从0到14,所以把这个数组的长度定义为16(事实上15就可以了)
从键盘的左上角(0,0)到右下角(7,7)的对角线以及平行线,就是对角线,就是diagonal 。同理,这个对角线及其平行线上任意2点都满足i1-i2=j1-j2.i-j的范围是-7到7,为了避免出现负数,程序里在这里+7,也是一个长度为16的数组(还是15就够了)
程序一开始的时候,i=j=0,所有的安全标识都是true,所以(0,0)这个点会被输出 。这时 , 把diagonal【7】置为false 。因为(1,1),(2 , 2)等等这些点都和(0,0)在一条对角线上(因为0-0+7=1-1+7=2-2+7),所以把这些点的对应的diagonal都置为false,也就是把diagonal【7】置为false
并且把undiagonal【0】也置为false , 但是因为undiagonal【0】对应的元素只有(0,0)(因为只有0+0=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("---------------");

推荐阅读