其实这道题,不知道,具体算法点儿,在哪儿??哎,虽然实回溯算法,但是我还是不太明白,还有的就是,输出的时候,是否有简单的方法,望告知,谢谢
题目:
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 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("----------------");
}
}
}
哈哈