zoukankan      html  css  js  c++  java
  • N皇后问题

    n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。

    给定一个整数n,返回所有不同的n皇后问题的解决方案。

    每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。

    样例

    对于4皇后问题存在两种解决的方案:

    [

        [".Q..", // Solution 1

         "...Q",

         "Q...",

         "..Q."],

        ["..Q.", // Solution 2

         "Q...",

         "...Q",

         ".Q.."]

    ]

    思路:由题意可知,每一行只能有一个,每一列也只能有一个,同一斜线上也只能有一个,  那么可以用一个数组来表示位置ARR[2]=1表示第三行的皇后在第二列(索引从0开始),这样每一行只会有一个了。main函数的主要作用是检查第i行可以放哪些位置,然后然后把对应的..Q序列放进temp中,然后递归调用main,最后要再把上一步放入的序列拿出来。。。本来一看好麻烦,可是动手开始敲了,当做一个个小问题来处理,没想到竟然一遍bug free了,还是要多尝试

    java版代码

    class Solution {
        /**
         * Get all distinct N-Queen solutions
         * @param n: The number of queens
         * @return: All distinct solutions
         * For example, A string '...Q' shows a queen on forth position
         */
        ArrayList<ArrayList<String>> solveNQueens(int n) {
            // write your code here
            int[] arr=new int[n];
            ArrayList<ArrayList<String>> ans=new ArrayList<ArrayList<String>>();
            ArrayList<String> temp=new ArrayList<String>();
            main(temp,ans,n,0,arr);
            return ans;
            
        }
        void main(ArrayList<String> temp,ArrayList<ArrayList<String>> ans,int n,int i,int[] arr){
            if(temp.size()==n){
                ans.add(new ArrayList(temp));
                return;
            }
            for(int k=0;k<n;k++){
                if(isthat(arr,i,k)){
                    arr[i]=k;
                    String s=pr(k,n);
                    temp.add(s);
                    main(temp,ans,n,i+1,arr);
                    temp.remove(temp.size()-1);
                }
            }
            return;
        }
        boolean isthat(int[] arr,int k,int n){
            for(int i=0;i<k;i++){
                if(arr[i]==n||Math.abs(i-k)==Math.abs(n-arr[i])){
                    return false;
                }
            }
            return true;
        }
        String pr(int n,int an){
            String s="";
            for(int i=0;i<n;i++){
                s+=".";
            }
            s+="Q";
            for(int i=n+1;i<an;i++){
                s+=".";
            }
            return s;
        }
    };
  • 相关阅读:
    Web API初印象
    SQL注入总结篇
    Debian Linux 下安装pip3
    DVWA:环境搭建
    AWVS使用手册
    常见的反爬虫和应对方法
    Fiddler抓取手机APP数据包
    爬虫 Scrapy框架 爬取图虫图片并下载
    python 爬虫基础知识(继续补充)
    Python 爬虫 多进程清洗代理
  • 原文地址:https://www.cnblogs.com/tobemaster/p/6092281.html
Copyright © 2011-2022 走看看