首页 > 其他 > 详细

51. N-Queens

时间:2018-09-14 11:25:40      阅读:182      评论:0      收藏:0      [点我收藏+]

一、题目

  1、审题

技术分享图片

  2、分析:

    n-皇后问题: 一个 n X n的棋盘,其中,每一行、每一列、每一斜行、每一反斜行都不能有重复的皇后,输出所有的可能。

 

二、解答

  1、思路:

    典型的回溯思想,运用 DFS 方法进行求解。其中:

    ①、斜行: [i-1][j-1]

    ②、 反斜行: [i-1][j+1]

class Solution {
    public List<List<String>> solveNQueens(int n) {
        List<List<String>> resultList = new ArrayList<List<String>>();
        
        char[][] arr = new char[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                arr[i][j] = ‘.‘; 
            }
        }
        helper(resultList, arr, 0, n);
        return resultList;
    }
    
    private void helper(List<List<String>> resultList, char[][] arr, int row, int n) {
        // 典型的回溯格式(DFS)
        if(row == n) {
            List<String> list = new ArrayList<>();
            for(int i = 0; i < n; i++) {
                list.add(String.valueOf(arr[i]));
            }
            resultList.add(list);
            return;
        }
        else {
            for(int col = 0; col != n; ++col) {
                if(isValid(arr, row, col, n)) {
                    arr[row][col] = ‘Q‘;
                    helper(resultList, arr, row+1, n);
                    arr[row][col] = ‘.‘; 
                }
            }
        }
        
    }

    public boolean isValid(char[][] arr, int row, int column, int n) {
        
        // check the column
        for (int i = 0; i != row; i++) {
            if(arr[i][column] == ‘Q‘)
                return false;
        }
        
        // check the 45 o
        for(int i = row - 1, j = column - 1; i >= 0 && j >= 0; --i, --j) {
            if(arr[i][j] == ‘Q‘)
                return false;
        }
        
        // check the 135 o
        for(int i = row -1, j = column + 1; i >= 0 && j < n; --i, ++j)
            if(arr[i][j]== ‘Q‘ )
                return false;
        
        return true;
    }
}

 

    

 

51. N-Queens

原文:https://www.cnblogs.com/skillking/p/9645433.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!