在国际象棋中,皇后的威力最猛,可以攻击跟它同一行、同一列或同一斜线的任意棋子。问题如下:在一个8*8的棋盘下,如何摆放8个皇后才能避免它们互相攻击呢?
一种策略是穷举猜测方法,但在64个方格中可能出现的情况有C(64,8)= 4426165368种!但是我们可以通过简单的观察,在排除同行同列的情况之下,其实就只有A(8,8)= 40320种,这样,这种方法就有了更大的可行性。假设从第一列的第一个方格开始,为每一列放置一个皇后,如果其中某一列在任何一个格子里都会被其他皇后攻击的话,我们要进行回溯,从该列的上一列重新尝试,依此类推:
Code
bool Queens::placeQueens( int currColumn) {
if( currColumn > BOARD_SIZE)
return true;
else {
bool queenPlaced = false;
int row = 1;
while(!queenPlaced && row <= BOARD_SIZE) {
//如果此处摆放皇后会被攻击,则增加一行继续尝试
//否则在些处摆放皇后
if(isUnderAttack(row,currColumn))
++row;
else{
setQueen(row,currColumn);
queenPlaced = placeQueens(currColumn + 1);
//回溯,删除先前摆放的皇后,增加一行继续尝试
if(!queenPlaced) {
removeQueen(row,currColumn);
++row;
}
}
}
return queenPlaced;
}
}