1. 程式人生 > >n-queens(N皇后問題)

n-queens(N皇后問題)

題目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;
    }
}