题目:
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
示例:
输入: 4 输出: 2 解释: 4 皇后问题存在如下两个不同的解法。 [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ]
我的解决办法,其实和51差不多:
package test;
public class LC52Try1
{
public int totalNQueens(int n)
{
int ret=0;
int[][] dp = new int[n][n];
ret=nQueens(n, dp, 0, 0);
return ret;
}
public int nQueens(int n, int[][] dp, int r, int l)
{
int ret=0;
if (r == n)
{
return 1;
}
for (int j = 0; j < n; j++)
{
if (!dp2(dp, r, j, n))
{
continue;
}
if (!dp3(dp, r, j, n))
{
continue;
}
dp[r][j] = 1;
ret+=nQueens(n, dp, r + 1, 0);
dp[r][j] = 0;
}
return ret;
}
// 列
public boolean dp2(int[][] dp, int r, int j, int n)
{
for (int i = 0; i < r; i++)
{
if (dp[i][j] == 1)
{
return false;
}
}
return true;
}
// 斜对角,其实满足 位置(a,b) |a-i|=|b-j|就可以
public boolean dp3(int[][] dp, int r, int l, int n)
{
int i = r;
int j = l;
// 左上斜对角
while (i > 0 && j > 0)
{
if (dp[i - 1][j - 1] == 1)
{
return false;
}
i--;
j--;
}
i = r;
j = l;
// 右上斜对角
while (i > 0 && j < n - 1)
{
if (dp[i - 1][j + 1] == 1)
{
return false;
}
i--;
j++;
}
return true;
}
public static void main(String[] args)
{
LC52Try1 t = new LC52Try1();
int ret = t.totalNQueens(4);
System.out.println(ret);
}
}
哈哈
扫描二维码关注公众号,回复:
2118584 查看本文章