LeetCode 51. N-Queens

Leetcode : N-Queens
Diffculty:Hard

N皇后问题,对八皇后问题的扩展,典型的回溯法算法题。
具体八皇后问题可以参考八皇后问题详解(四种解法)

LeetCode 这道题的扩展在于,不只是扩展到N皇后的情形,还要求把每一个结果都返回。

由于棋盘是对称的,那么我们只需要求第一个皇后为起点,在棋盘左边的结果,那么对于中轴线对称以后,一定有一个在右边对称的结果。(此处要判断N的奇偶性)
具体做法:
1)我们可以建立一个二维数组,0表示未占用,1表示占用。
2)然后以y轴逐层向下找可以放皇后的位置,每到一层,就把x从0~len 找一遍。
3)checkPosition方法,只需要找左上,上,和右上 即可。(因为是从上往下找位置的,下面的找到的一定是满足上面已放置皇后的情况。)

下面上代码:

// 4ms - beats 91.99%
// 这里一定要注意奇偶判断,对于奇数情况,要对中间的那个位置在找一遍结果,并且image=false
public static List> solveNQueens(int n) {
        List> result = new ArrayList<>();
        int[][] cheese = new int[n][n];
        for(int i=0; i> result, int y, int x, boolean image){
        cheese[y][x] = 1;
        if(y == cheese.length-1){
            addResult(cheese, result, image);
        }else{
            for(int i=0; i> result, boolean image){
        List list = new ArrayList<>(cheese.length);
        List imageList = null;
        if(image){
            imageList = new ArrayList<>(cheese.length);
        }
        for(int i=0; i=0; i--){
            left -= 1;
            right +=1;
            leftCheck = left<0 ? true : cheese[i][left]==0;
            rightCheck = right>=len ? true : cheese[i][right]==0;
            upCheck = cheese[i][x]==0;
            result = leftCheck && rightCheck && upCheck;
            if(!result){
                return false;
            }
        }
        return true;
    }

你可能感兴趣的:(LeetCode 51. N-Queens)