1. 程式人生 > >34 N皇後問題Ⅱ

34 N皇後問題Ⅱ

script ace white || spa case 評測 tex 皇後

原題網址:https://www.lintcode.com/zh-cn/old/problem/n-queens-ii/

34. N皇後問題 II

討論區

根據n皇後問題,現在返回n皇後不同的解決方案的數量而不是具體的放置布局。

您在真實的面試中是否遇到過這個題? Yes 樣例

比如n=4,存在2種解決方案

標簽 Zenefits 遞歸 方法同N皇後問題,只不過不生成解決方案而是返回解決方法的個數。 1.遞歸 AC代碼:
class Solution {
public:
    /**
     * @param n: The number of queens.
     * @return: The total number of distinct solutions.
     
*/ bool canPlaceQ(int row,int col, int * position,int n) { for (int i=0;i<row;i++) { if (position[i]==col||abs(row-i)==abs(col-position[i])) { return false; } } return true; } void placeQ(int &count,int row,int *position,int n) { if (row==n) {
++count; } else { for (int j=0;j<n;j++) { if (canPlaceQ(row,j,position,n)) { position[row]=j; placeQ(count,row+1,position,n); } } } } int totalNQueens(int n) { int count=0; if (n<=0
) { return 0; } int *position=new int[n]; for (int i=0;i<n;i++) { position[i]=-1; } int row=0; placeQ(count,row,position,n); return count; } };

2.非遞歸

AC代碼:

class Solution {
public:
    /**
     * @param n: The number of queens.
     * @return: The total number of distinct solutions.
     */
    bool canPlaceQ(int row,int col, int * position,int n)
{
    for (int i=0;i<row;i++)
    {
        if (position[i]==col||abs(row-i)==abs(col-position[i]))
        {
            return false;
        }
    }
    return true;
}

void placeQ(int &count,int row,int *position,int n)
{
    int i=0,j=0;
    while(i<n)
    {
        while(j<n)
        {
            if (canPlaceQ(i,j,position,n))
            {
                position[i]=j;
                j=0;
                break;
            }
            else
            {
                ++j;
            }
        }

        if (position[i]==-1)
        {
            if (i==0)
            {
                break;
            }
            --i;
            j=position[i]+1;
            position[i]=-1;//註意清空上一行的位置!!;
            continue;
        }

        if (i==n-1)
        {
            ++count;
            j=position[i]+1;//不能用++j,因為尋找到n-1行的列位置後j被重置為0;
            position[i]=-1;
            continue;
        }
        ++i;
    }

}

int totalNQueens(int n)
{
    int count=0;
    if (n<=0)
    {
        return 0;
    }
    int *position=new int[n];
    for (int i=0;i<n;i++)
    {
        position[i]=-1;
    }
    int row=0;
    placeQ(count,row,position,n);

    return count;
}

};

34 N皇後問題Ⅱ