Leetcode 51 N-Queens N皇后问题,希望有人给我个,更简单的,望告知

其实这道题,不知道,具体算法点儿,在哪儿??哎,虽然实回溯算法,但是我还是不太明白,还有的就是,输出的时候,是否有简单的方法,望告知,谢谢

题目:

皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法。

给定一个整数 n,返回所有不同的 皇后问题的解决方案。

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例:

输入: 4
输出: [
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

我的代码如下:一行一行的处理

package test;

import java.util.ArrayList;
import java.util.List;

public class LC51Try1
{
	public List<List<String>> solveNQueens(int n)
	{
		List<List<String>> ret = new ArrayList<List<String>>();
		int[][] dp = new int[n][n];		
		nQueens(n,dp,ret,0,0);
		return ret;
	}
	public boolean nQueens(int n,int[][] dp,List<List<String>> ret,int r,int l){
		if(r==n){
			List<String> list= new ArrayList<String>();
			for(int g=0;g<n;g++){
				String str="";
				for(int k=0;k<n;k++){
					if(dp[g][k]==1){
						str+="Q";
					}else{
						str+=".";
					}
				}
				list.add(str);
			}
			ret.add(list);
			return true;
		}
		for(int j=0;j<n;j++){
			/*if(!dp1(dp,r,n)){
				continue;
			}*/
			if(!dp2(dp,r,j,n)){
				continue;
			}
			if(!dp3(dp,r,j,n)){
				continue;
			}
			dp[r][j]=1;
			nQueens(n,dp,ret,r+1,0);
			dp[r][j]=0;
		}
		return false;
		
		
	}
    //其实行都不需要
	public boolean dp1(int[][] dp, int i, int n)
	{
		for (int j = 0; j < n; j++)
		{
			if (dp[i][j] == 1)
			{
				return false;
			}
		}
		return true;
	}
    //列
	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)
	{
		LC51Try1 t = new LC51Try1();
		List<List<String>> ret = t.solveNQueens(4);
		for(int i=0;i<ret.size();i++){
			List<String> list= ret.get(i);
			for(int j=0;j<list.size();j++){
				System.out.println(list.get(j));
			}
			System.out.println("----------------");
		}
	}
}

哈哈

猜你喜欢

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