Leetcode初学——N皇后

荒凉一梦 提交于 2020-02-07 00:45:58

题目:

分析:

N皇后问题的本质是什么?

已占用的格子的行、列、对角线上都不能有棋子存在

每个格子之间的关系如下

行和列不重复是容易判断的,那么两个对角线该怎么判断呢?

蓝色的对角线上的格子有一个关系  : 行数+列数=常数

红色对角线上的格子也有一个关系  :行数-列数=常数

并且每个常数都不相同

对4皇后问题的一种解法作图:

上图可以较清楚的展示各个棋子之间的关系

那么这道题该怎么写呢?

我使用的是回溯法,以递归的形式,对每一个可能可以的格子进行遍历

代码:

class Solution {
    private List<List<Integer>> list=new ArrayList<List<Integer>>();
    public List<List<String>> solveNQueens(int n) {
        StringBuilder strs=new StringBuilder();
        List<List<String>> res=new ArrayList<List<String>>();
        for(int i=0;i<n;i++){
            strs.append('.');
        }
        String str=strs.toString();
        HelpToSolveNQueens(n,new ArrayList<Integer>(),new ArrayList<Integer>(),new ArrayList<Integer>());
        for(int i=0;i<list.size();i++){
            List<String> temp=new ArrayList<String>();
            for(int j=0;j<list.get(i).size();j++){
                strs=new StringBuilder(str);
                strs.replace(list.get(i).get(j)-1,list.get(i).get(j),"Q");
                temp.add(strs.toString());
            }
            res.add(temp);
        }
        return res;
    }

    //递归函数
    //queen用于存储每一行中皇后所在的列
    //sum用于判断已有皇后的左对角线是否有重合
    //diff用于判断已有皇后的右对角线是否有重合
    public void HelpToSolveNQueens(int n,List<Integer> queen,List<Integer> sum,List<Integer> diff){
        if(queen.size()==n){
            list.add(new ArrayList<Integer>(queen));
            return;
        }

        for(int i=1;i<=n;i++){
            int temp_sum=queen.size()+i+1;
            int temp_diff=queen.size()+1-i;
            if((!queen.contains(i)) && (!sum.contains(temp_sum)) && (!diff.contains(temp_diff))){
                queen.add(i);
                sum.add(temp_sum);
                diff.add(temp_diff);
                HelpToSolveNQueens(n,queen,sum,diff);
                queen.remove(queen.size()-1);
                sum.remove(sum.size()-1);
                diff.remove(diff.size()-1);
            }
        }
    }
}

结果:

如果有什么疑问的话,可以在评论区里交流

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!