Leetcode每日一題:52.N-Queens II(N皇后Ⅱ)

Taco_Tuesdayyy發表於2020-10-18

在這裡插入圖片描述
思路:一共有n行n列,放置n個皇后,同行同列同斜對角線都最多隻能有一個皇后;相當於從0~n-1行,每一行放一個,把第k行的皇后放在第j列時,檢查前面0~k-1行的皇后是否與第k行皇后的位置衝突,若衝突則嘗試把它放下一列
在這裡插入圖片描述

//判斷第k行的皇后所放置的位置是否與前面k-1個皇后衝突
bool judge(int *place, int k, int j)
{
    for (int i = 0; i < k; i++)
    {
        //判斷第i個皇后是否與第k個皇后同列,或者同對角線abs(x2-x1)==abs(y2-y1)
        if (place[i] == j || (k - i) == abs(j - place[i])) //如果衝突
        {
            return true;
        }
    }
    return false;
}

    //放置第k行的皇后到place[k]列上
    void check(int *place, int k, int n, int &res)
    {
        if (k == n) //已放置n個皇后,無需再放置,方案個數++
        {
            res++;
            return;
        }
        for (int j = 0; j < n; j++) //第k行的皇后所放置的位置從0~n-1挨個試
        {
            if (!judge(place, k, j)) //如果第k行的皇后放在第j列與前面的皇后不衝突的話,開始放置第k+1個皇后
            {
                place[k]=j;
                check(place, k + 1, n, res);
            }
            //如果衝突,則嘗試下一個位置
        }
    }

int totalNQueens(int n)
{
    int res = 0;
    int *place = new int[n];
    check(place, 0, n, res);//初始放置第0行的皇后
    return res;
}

相關文章