四皇后

来源:互联网 发布:js金额大写转换函数 编辑:程序博客网 时间:2024/04/30 01:17


public class 四皇后 {


/**
* 四皇后问题求解 :如何在4*4的棋盘上无冲突的摆放4个皇后棋子。
* 国际象棋中,皇后的移动方式为横竖交叉的,因此任意一个皇后所在的位置的水平、竖直以及45度斜线上都不能出现其他皇后的棋子
* 思想:构造出一棵解空间树,通过探索这棵解空间树,可以得到四皇后问题的一种或几种解。这样的解空间树共有4棵(比较浪费资源)。
* 其实,它完全可以通过一个"递归回溯"来模拟,所谓解空间树只是一个逻辑上的抽象。
*/
public static void main(String[] args) {
int Q[][] = new int[4][4];
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
Q[i][j]=0;
}
}
Queen(0,Q);
}



static void Queen( int k, int Q[][] ){ //K为列 i为行
int i,j;
if(k==4 ){ //递归结束条件
System.out.println("k=4");
for( i=0;i<4;i++ ){ //得到一个解,在屏幕上输出结果
for( j=0;j<4;j++ ){
System.out.print(Q[i][j]);
}
System.out.println();
}
return;
}
for( i=0;i<4;i++ ){
if( isCorrect(i,k,Q) == 1){ //若Q[i][k]可以放置皇后(剪枝)
Q[i][k] = 1; //放置皇后
System.out.println("行:"+i+"..列:"+k+"插入1");
Queen(k+1,Q); //递归深度优先搜索解空间树
Q[i][k] = 0;  //回溯操作
}
}
System.out.println();
}

static int isCorrect( int i,int j,int Q[][] ){  //返回0不可放置,1可放置
int s,t;
for( s=i,t=0;t<4;t++ ){
if( Q[s][t]==1 && t!=j ) return 0;  //判断行
}
for( t=j,s=0;s<4;s++ ){
if( Q[s][t]==1 && s!=i ) return 0;//判断列
}
for( s=i-1,t=j-1;s>=0&&t>=0;s--,t-- ){
if( Q[s][t]==1 ) return 0;//判断左上方
}
for( s=i+1,t=j+1; s<4&&t<4; s++,t++ ){
if( Q[s][t]==1 )  return 0;//判断右下方
}
for( s=i-1,t=j+1; s>=0&&t<4; s--,t++){
if( Q[s][t]==1 )  return 0;//判断右上方
}
for( s=i+1,t=j-1; s<4&&t>=0; s++,t-- ){
if( Q[s][t]==1 )  return 0;//判断左下方
}
return 1;
}
}
1 0