设计一种算法,打印八皇后在8*8棋盘上的各种摆法

设计一种算法,打印八皇后在8*8棋盘上的各种摆法_第1张图片设计一种算法,打印八皇后在8*8棋盘上的各种摆法_第2张图片设计一种算法,打印八皇后在8*8棋盘上的各种摆法_第3张图片

int GRID_SIZE=8;
void placeQueens(int row,Integer[] columns,ArrayList results)
{
if(row == GRID_SIZE)//找到有效的摆法
{
results.add(columns.clone());
}
else
{
for(int col=0;col{
if(checkValid(columns,row,col))
{
columns[row]=col;//摆放皇后
placeQueens(row+1,columns,results);
}
}
}
}
/*  检查(row1,column1)可否摆放皇后,做法是检查有无其他皇后位于同一列或对角线,不必检查
* 是否在同一行上,因为调用placeQueen时,一次只会摆放一个皇后,由此可知,这一行是空的
*/
boolean checkValid(Integer[] columns,int row1,int column1)
{
for(int row2=0;row2{
int column2=columns[row2];
/*检查(row2,column2)是否会让(row1,column1)变成无效,摆放位置
*/
//检查同一列有无其他皇后
if(column1==column2)
return false;

/*检查对角线:若两列的距离等于两行的距离,就表示两个皇后在同一对角线上
*/
int columnDistance=Math.abs(column2-column1);
//row1>row2 不用取绝对值
int rowDistance=row1-row2;
if(columnDistance== rowDistance)
{
return false;
}
}
return true;
}

每一行智能摆放一个皇后,因此不需要将棋盘储存为完整的8*8矩阵,只需一维数组,其中columns[r]=c表示有个皇后位于行r列c。


你可能感兴趣的:(程序员面试金典第5版)