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

题目1来自牛客网leetcode
题目2来自牛客网leetcode

猜你喜欢

转载自blog.csdn.net/everyfriday_shujk/article/details/80219437