Leetcode 52 N-Queens ii N皇后问题2

题目:

皇后问题研究的是如何将 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 查看本文章

猜你喜欢

转载自blog.csdn.net/ata_123/article/details/80905185
今日推荐