public class EightQueue {
//检查指定的行和列位置是否可以放置皇后,如果可以放置返回1,否则返回0;
public static int check(int a[][],int row,int col) {
int i,j;
//判断行
for(i =1;i<col;i++) {
if(a[row][i] == 1) return 0;
}
//判断列
for(i=1;i<row;i++) {
if(a[i][col] == 1) return 0;
}
//判断对角线
//判断↗的对角线
for(i=row-1,j=col+1;i>0&&j<9;i--,j++) {
if(a[i][j] == 1) return 0;
}
//判断↘的对角线
for(i=row-1,j=col-1;i>0&&j>0;i--,j--) {
if(a[i][j] == 1) return 0;
}//通过上面检查没问题,说明该位置可以放置皇后
return 1;
}
//获取指定行的皇后所在的列数
public static int GetColumnAtRow(int a[][],int row) {
int i=0;
for(i=1;i<9;i++) {
if(a[row][i] == 1)
return i;
}
return -1;
}
//放置8个皇后的函数
public static int SetQueen(int a[][],int row,int col) {
if(row == 9)//如果到了最后一行的下一行,表示皇后已经全部放置完成。
return 1;
//如果到了最后一列之后
if(col == 9) {
if(row == 1) return 0;//如果到了第一行的最后一列,还是放不下,那就不能完成任务。
//如果不是第一行就回溯到上一行的位置从下一列的位置开始放置。先要清空原来皇后的位置。(获取上一行皇后的位置)
int c = GetColumnAtRow(a,row-1);
a[row-1][c] = 0;//取消上一行皇后的放置位置
return SetQueen(a,row-1,c+1);
}
//检查该位置是否可以放置皇后。
if(check(a,row,col) == 1)
{
a[row][col] = 1;
//递归调用,放置下一行的皇后。
return SetQueen(a,row+1,1);
}
else
//如果当前位置不能放,就往下一列进行试探。
return SetQueen(a,row,col+1);
}
public static void main(String [] args) {
int [][] a = new int[9][9];//用于保存八个皇后放置的位置的记录。
int i,j;
if(SetQueen(a,1,1) == 1) {
System.out.println("皇后放置完成");
for(i=1;i<9;i++) {
for(j=1;j<9;j++) {
if(a[i][j] == 1) System.out.print("@ ");
else System.out.print("- ");
}
System.out.println();
}
}
}
}
八皇后问题 java
最新推荐文章于 2023-08-05 16:26:54 发布