n-queens(N皇后問題)
阿新 • • 發佈:2019-02-06
題目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;
}
}