52.N皇后II

2019-01-13  本文已影响0人  郭昊峰

皇后问题研究的是如何将 n个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

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

比较经典的算法题,运用到递归的方法。

以八皇后为例,思考步骤如下:

1:因为每一行只能存在一个皇后(否则可以互相攻击),所以行号可以作为递归函数的参数。每一次进入递归函数,index(行号)依次为0,1,2……7,然后在每一列分别尝试放置皇后。

2:判断的方法可以通过三个布尔型数组,分别存放列向和两个斜向的存放可能性,正如第一列放下皇后后其他皇后不能放在第一列,8*8棋盘有30条斜线(一个方向15条),任何一个布尔型数组为true(同一列,斜向有皇后),则尝试下一列的放置。

3:回溯,当第八个皇后在第八行放置后,返回一个计数1,这样每完成一次N皇后放置计数便会加1并且停止递归。然后把当前的皇后棋子变为false(等于把三个布尔型数组变为false),继续循环直至每一行的每一列都尝试过放下棋子。

public class Solution {

    private Boolean[] col;

    //左上右下,对应位置为x-y+n-1

    private Boolean[] dia1;

    //左下右上,对应位置为x+y

    private Boolean[] dia2;

    public int TotalNQueens(int n) {

        col = new Boolean[n];

        dia1 = new Boolean[2 * n - 1];

        dia2 = new Boolean[2 * n - 1];

        return putQueens(n , 0); 

    }

    public int putQueens(int n , int index)

        {

            int res = 0;

            if (n == index)

            {

                return 1;

            }

            for (int i = 0; i < n; i++)

            {

                if (!col[i] && !dia1[index - i + n - 1] && !dia2[index + i])

                {

                    col[i] = true;

                    dia1[index - i + n - 1] = true;

                    dia2[index + i] = true;

                    res = putQueens(n, index + 1) + res;

                    col[i] = false;

                    dia1[index - i + n - 1] = false;

                    dia2[index + i] = false;

                }

            }

            return res;

        }

}

上一篇 下一篇

猜你喜欢

热点阅读