问题描述:将八个皇后摆在一张8X8的国际象棋棋盘上,皇后可以吃掉其同一列、同一行或者同一条对角线上的皇后,那么使每个皇后都无法吃掉别的皇后,这样一共有多少种摆法?
算法思想:
这是经典的回溯算法的应用,8x8的棋盘我们可以按行或者按列确定皇后的位置,比如我这边是按行安排皇后的位置,那么堆栈里存放的则是其所在列数。
当放置一个新皇后时需要检测她是否会被之前放置的皇后吃掉,如果没有吃掉则记录所在列数并推入栈中。如果遍历这一行都不适合,则回溯到上一行重新放置上一个皇后,以此类推,把最后一个皇后都放置好。
代码实现:
网上有各种炫酷的方式能实现这个算法,下面介绍的可能就比较粗糙,但比较直观通俗。
设置的一些变量如下:
static int TRUE=1,FALSE=0,EIGHT=8;
static int[] queen=new int[EIGHT]; //记录皇后的列数
static int number=0;
attack 函数用来判断(row,col)这一位置是否与之前放置的皇后存在冲突,即是否会被之前的皇后吃掉,返回atk=TURE则表示会有冲突。
/*attatck函数
* 判断(row,col)位置是否符合要求
*/
public static int attack(int row,int col) {
int i=0,atk=FALSE;
int offsetRow=0,offsetCol=0;
while((atk!=1)&&i<col) {
offsetRow=Math.abs(queen[i]-row);
offsetCol=Math.abs(i-col);
//在同一列或者同一对角线则不符合要求
if((queen[i])==row||offsetRow==offsetCol)
atk=TRUE;
i++;
}
return atk;
}
}
按行依次确定八个皇后所在列数
/*确定皇后的位置*/
public static void decidePosition(int value) {
int i=0;
while(i<EIGHT) {
if(attack(i,value)!=1) {
queen[value]=i;
if(value==7)
printTable(); //八皇后位置均确定,打印输出位置
else
decidePosition(value+1);
}
i++;
}
}
输出结果如下,一共会有92种解,这个也算常识了。。
详细代码连接如下:点击打开链接
https://download.csdn.net/download/weixin_40447467/10303052