小小程序媛  
得之坦然,失之淡然,顺其自然,争其必然

题目

Follow up for N-Queens problem.

Now, instead outputting board configurations, return the total number of distinct solutions.

1

分析

N皇后问题,同LeetCode 51 N-Queens,只不过,此题要求给出问题的合理解个数,而无需给出具体分布。

只需在上题的基础上,稍加修改,只计数便可达到要求,此题采用另一种求解N皇后问题的方法:

用一个一位数组来存放当前皇后的状态。假设数组为int state[n], state[i]表示第 i 行皇后所在的列。那么在新的一行 k 放置一个皇后后:

  1. 判断列是否冲突,只需要看state数组中state[0…k-1] 是否有和state[k]相等;

  2. 判断对角线是否冲突:如果两个皇后在同一对角线,那么|row1-row2| = |column1 - column2|,(row1,column1),(row2,column2)分别为冲突的两个皇后的位置

此种判别方式,相比上题采用的方法,简单许多。

AC代码

class Solution {
private:
    int ret = 0;
public:
    int totalNQueens(int n) {
        if (n <= 0)
            return 0;

        //存储安置皇后的当前解(存储N皇后所在的列数,初始化为-1)
        vector<int> state(n, -1);
        set_queens(state, 0);
        return ret;
    }

    void set_queens(vector<int> &state, int row)
    {
        int n = state.size();
        if (row == n)
        {
            ret++;
            return;
        }
        else{
            for (int col = 0; col < n; col++)
            {
                if (isValid(state, row, col))
                {
                    state[row] = col;
                    set_queens(state, row + 1);
                    state[row] = -1;
                }//if
            }//for
        }
    }

    //判断在row行col列位置放一个皇后,是否是合法的状态
    //已经保证了每行一个皇后,只需要判断列是否合法以及对角线是否合法。
    bool isValid(vector<int> &state, int row, int col)
    {
        for (int i = 0; i < row; i++)
        {
            if (state[i] == col || abs(row - i) == abs(col - state[i]))
                return false;
        }//for
        return true;
    }
};

GitHub测试程序源码

posted on 2015-10-02 20:24  Coding菌  阅读(174)  评论(0编辑  收藏  举报