Leetcode刷题之路(51-60)

微笑、不失礼 提交于 2019-12-10 08:48:39

51.N皇后

N皇后题目链接

  • N皇后就是同一行,同一列,同一对角线只能存在一个皇后,而输入是n*n格子,答案让你输出对应的方案
private List<List<String>> results;
    public List<List<String>> solveNQueens(int n)  {
        results = new ArrayList<>();
        if(n==0){
            results.add(new ArrayList<>());
            return results;
        }
        boolean [][] vis= new boolean[n][n];
        dfs(0,n,vis);//从第一排开始
        return results;
    }

    private void dfs(int x,int n,boolean [][] vis){
        if(x==n){
            List<String> list = new ArrayList<>();
            for(int i=0;i<n;i++){
                StringBuilder stringBuilder = new StringBuilder();
                for(int j=0;j<n;j++){
                    if(vis[i][j]){
                        stringBuilder.append("Q");
                    }
                    else{
                        stringBuilder.append(".");
                    }
                }
                list.add(stringBuilder.toString());
            }
            results.add(list);
            return;
        }
        for(int i=0;i<n;i++){
            int y = i;
            if(check(x,y,n,vis)){
                vis[x][y]=true;
                dfs(x+1,n,vis);
                vis[x][y]=false;
            }
        }
    }

    private boolean check(int x,int y,int n,boolean[][]vis){
        for(int i=0;i<n;i++){//判断同一列是否只存在一个
            if(i!=x&&vis[i][y]){
                return false;
            }
        }
        //后边四个条件是判断对角线是否只存在一个
        for(int i=x,j=y;i<n&&j<n;i++,j++){
            if(vis[i][j]){
                return false;
            }
        }
        for(int i=x,j=y;i>=0&&j>=0;i--,j--){
            if(vis[i][j]){
                return false;
            }
        }
        for(int i=x,j=y;i<n&&j>=0;i++,j--){
            if(vis[i][j]){
                return false;
            }
        }
        for(int i=x,j=y;i>=0&&j<n;i--,j++){
            if(vis[i][j]){
                return false;
            }
        }
        return true;
    }

52.N皇后II

N皇后题目链接

  • N皇后就是同一行,同一列,同一对角线只能存在一个皇后,而输入是n*n格子,答案让你输出有几种方案
private int results;
    public int totalNQueens(int n) {
        results = 0;
        if(n==0){
            return results;
        }
        boolean [][] vis= new boolean[n][n];
        dfs(0,n,vis);//从第一排开始
        return results;
    }

    private void dfs(int x,int n,boolean [][] vis){
        if(x==n){
            results++;
            return;
        }
        for(int i=0;i<n;i++){
            int y = i;
            if(check(x,y,n,vis)){
                vis[x][y]=true;
                dfs(x+1,n,vis);
                vis[x][y]=false;
            }
        }
    }

    private boolean check(int x,int y,int n,boolean[][]vis){
        for(int i=0;i<n;i++){//判断同一列是否只存在一个
            if(i!=x&&vis[i][y]){
                return false;
            }
        }
        //后边四个条件是判断对角线是否只存在一个
        for(int i=x,j=y;i<n&&j<n;i++,j++){
            if(vis[i][j]){
                return false;
            }
        }
        for(int i=x,j=y;i>=0&&j>=0;i--,j--){
            if(vis[i][j]){
                return false;
            }
        }
        for(int i=x,j=y;i<n&&j>=0;i++,j--){
            if(vis[i][j]){
                return false;
            }
        }
         for(int i=x,j=y;i>=0&&j<n;i--,j++){
            if(vis[i][j]){
                return false;
            }
        }
        return true;
    }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!