52.N皇后II
n 皇后问题研究的是如何将 n个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
比较经典的算法题,运用到递归的方法。
以八皇后为例,思考步骤如下:
1:因为每一行只能存在一个皇后(否则可以互相攻击),所以行号可以作为递归函数的参数。每一次进入递归函数,index(行号)依次为0,1,2……7,然后在每一列分别尝试放置皇后。
2:判断的方法可以通过三个布尔型数组,分别存放列向和两个斜向的存放可能性,正如第一列放下皇后后其他皇后不能放在第一列,8*8棋盘有30条斜线(一个方向15条),任何一个布尔型数组为true(同一列,斜向有皇后),则尝试下一列的放置。
3:回溯,当第八个皇后在第八行放置后,返回一个计数1,这样每完成一次N皇后放置计数便会加1并且停止递归。然后把当前的皇后棋子变为false(等于把三个布尔型数组变为false),继续循环直至每一行的每一列都尝试过放下棋子。
public class Solution {
private Boolean[] col;
//左上右下,对应位置为x-y+n-1
private Boolean[] dia1;
//左下右上,对应位置为x+y
private Boolean[] dia2;
public int TotalNQueens(int n) {
col = new Boolean[n];
dia1 = new Boolean[2 * n - 1];
dia2 = new Boolean[2 * n - 1];
return putQueens(n , 0);
}
public int putQueens(int n , int index)
{
int res = 0;
if (n == index)
{
return 1;
}
for (int i = 0; i < n; i++)
{
if (!col[i] && !dia1[index - i + n - 1] && !dia2[index + i])
{
col[i] = true;
dia1[index - i + n - 1] = true;
dia2[index + i] = true;
res = putQueens(n, index + 1) + res;
col[i] = false;
dia1[index - i + n - 1] = false;
dia2[index + i] = false;
}
}
return res;
}
}