8皇后问题是一种经典算法问题。
问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。计算机发明后,有多种计算机语言可以编程解决此问题。
下面用jvav递归实现:
递归:逐行递归
Math.abs(y - i) != Math.abs(x - ary[i]) //用于判断斜方向是否有其它皇后
意思是数学中的 |x1-x2| != |y1-y2|
public class Queen8{
static int num = 1;
public static void main(String[] args) {
//棋盘固定8*8 只需一维数组记录皇后位置
//int ary[] = new ary[8];
int ary[] = {-1,-1,-1,-1,-1,-1,-1,-1} ;
printary(ary);
//int num = 1; //解法计数
方法(ary,0);
}
public static void 方法(int ary[],int y){
// y表示列
int x; // x表示行
int i; // 临时变量 遍历列
if (y == 0){ // 第0行时
for(x = 0;x < 8;x++){
ary[0] = x;
方法(ary,1);
}
}
else{ //非0行时
for(x = 0;x < 8;x++){
for(i = 0;i < y;i++){
if (x != ary[i] && Math.abs(y - i) != Math.abs(x - ary[i]) )
{if(i != y - 1) continue;} else break;
ary[y] = x; //此时记录皇后x坐标
if (y == 7) {
System.out.println("第" + num + "个解为:");
printary(ary);
num++;
System.out.println("");
}
else{
方法(ary,y+1);
}
}
}
}
}
//输出棋盘的方法
static void printary(int ary[]){
for(int y = 0;y < 8;y++){
for(int x = 0;x < 8 ;x++){
if (x == ary[y]) System.out.print("皇");
else System.out.print("■");
}
System.out.println("");
}
}
}
执行结果:
今天是笔者自学jvav的第6天,算法可能不完美,以后再着手优化吧