题目1
n皇后难题是将n皇后放在n×n棋盘上的问题,任意两个皇后不在同一行,同一列或同一斜线上。 给定一个整数n,返回n皇后拼图的所有不同的解决方案。 每个解决方案都包含n皇后位置的不同棋盘配置,其中'Q'和'.'分别表示皇后和空位。 例如,对于四皇后拼图存在两种截然不同的解决方案: [ [“.Q ..”,//解决方案1 “...... Q”, “Q...” “..Q.”], [“..Q.”,//解决方案2 “Q...” “...... Q”, “.Q.”] ]
代码1
import java.util.ArrayList;
public class Solution {
public ArrayList<String[]> solveNQueens(int n) {
ArrayList<String []> result=new ArrayList<>();
if(n<1) return result;
char [][] chars=new char [n][n];//chars[i][j]代表位置(i,j)是皇后还是空位
for(int i=0;i<n;i++){//初始化棋盘
for(int j=0;j<n;j++){
chars[i][j]='.';
}
}
process(0,chars,n,result);
return result;
}
public void process(int i,char [][] chars,int n,ArrayList<String []> result){
if(i>=n){
String [] temp=new String [n];
for(int j=0;j<n;j++){
temp[j]=new String(chars[j]);
}
result.add(temp);
}else{
for(int j=0;j<n;j++){
if(isValid(chars,i,j)){
chars[i][j]='Q';
process(i+1,chars,n,result);
}
chars[i][j]='.';
}
}
}
public boolean isValid(char [][] chars,int i,int j){
for(int k=0;k<i;k++){//检查列
if(chars[k][j]=='Q'){
return false;
}
}
int m=i,n=j;
while(--m>=0 && --n>=0){//检查反斜线
if(chars[m][n]=='Q'){
return false;
}
}
while(--i>=0 && ++j<chars.length){//检查斜线
if(chars[i][j]=='Q'){
return false;
}
}
return true;
}
}
题目2
跟进N皇后问题。 现在返回不同解决方案的总数。
代码2
public class Solution {
public int totalNQueens(int n) {
if(n<1) return 0;
int [] record=new int [n];//record[i]记录了第i行皇后所在的列号
return process(0,record,n);
}
public int process(int i,int [] record,int n){
if(i==n){
return 1;
}
int res=0;
for(int j=0;j<n;j++){
if(isValid(record,i,j)){
record[i]=j;
res+=process(i+1,record,n);
}
}
return res;
}
public boolean isValid(int [] record,int i,int j){
for(int k=0;k<i;k++){
if(record[k]==j || Math.abs(record[k]-j)==Math.abs(k-i)){
return false;
}
}
return true;
}
}
题目1来自牛客网leetcode
题目2来自牛客网leetcode