LeetCode-51.N-Queens

来源:互联网 发布:微总汇软件怎么样 编辑:程序博客网 时间:2024/05/20 21:46

一、问题描述

  1. N皇后问题,在NXN的棋盘上放置N个皇后,使其相互无法吃到对方,求解共有多少种放置方法,并按照相应的规则打印放置结果。
  2. 例如,输入n为4,输出结果为,
    [ [“.Q..”, “…Q”,”Q…”,”..Q.”],[“..Q.”,”Q…”,”…Q”,”.Q..”] ]

二、解题思路

  1. 回溯求解,通过迭代实现。例如,确定第i行的Q位置,从第i行的第0个位置开始,判断该位置能否放置Q,如果可以放置,则通过同样的思路确定第i+1行Q的位置;如果不能放置,则尝试第i行第1个位置,依次类推。
  2. 记录已放置Q的位置,使用一维数组即可,数组的下表代表Q所在的行,数组中的元素代表Q所在的列;判断某个位置(tx,ty)是否可以放置Q,需要该位置和它前面的每一行Q位置(qx,qy)做判断,主要判断两点:(1)qy!=ty.(2)Math.abs(qx-tx)!=Math.abs(qy-ty).

三、代码

public class Solution {    //int[][] map=new int[n][n];    List<List<String>> result=new ArrayList<List<String>>();    public List<List<String>> solveNQueens(int n) {        //point的初始值设置为-1        int[] point=new int[n];        for(int i=0;i<n;i++)            point[i]=-1;        nQueenCore(0,point,n);        return result;    }    private void nQueenCore(int row,int[] point,int n){        if(row==n-1){            for(int i=0;i<n;i++){                if(isValid(row,i,point)){                    point[n-1]=i;                    generateRe(point,n);                    point[n-1]=-1;                }            }        }else{            for(int i=0;i<n;i++){                if(isValid(row,i,point)){                    point[row]=i;                    nQueenCore(row+1,point,n);                    point[row]=-1;                }            }        }    }    private boolean isValid(int row,int col,int[] point){        for(int i=0;i<row;i++){            if(Math.abs(row-i) == Math.abs(col-point[i]) || point[i]==col){                return false;            }        }        return true;    }    private void generateRe(int[] point,int n){        List<String> tem=new ArrayList<String>();        for(int i=0;i<n;i++){            if(point[i]==-1)                break;            StringBuilder sb=new StringBuilder();            for(int j=0;j<n;j++){                if(j==point[i]){                    sb.append("Q");                }else{                    sb.append(".");                }            }            tem.add(sb.toString());        }        result.add(tem);    }}
原创粉丝点击