其他分享
首页 > 其他分享> > leetcode-回溯-51

leetcode-回溯-51

作者:互联网

题面

image-20201226190722892

重点

源代码(回溯法,记住这个模板)

class Solution
{
public:
    void ge(int index,int n, vector<vector<string>> &result,vector<string>& temp,bool hashTable[],int P[])
    {
        if(index==n+1)
        {
            result.push_back(temp);
            return;
        }
        //当前处在第index行,i从第1列到第n列进行枚举,看看这一列是否满足要求
        for(int i=1; i<=n; i++)
        {
            //第i列还没有被访问过
            if(!hashTable[i])
            {
                int pre = index;
                //j表示之前的行数,P[j]表示第j行皇后在第P[j]列
                int j = 1;
                bool flag = true;
                while(j<pre && flag)
                {
                    if(abs(j-index)==abs(P[j]-i))
                    {
                        flag = false;
                    }
                    else
                    {
                        j++;
                    }
                }
                //和前面所有行都可以构成合法n皇后
                if(flag)
                {
                    //第index行的皇后,处在第i列
                    P[index] = i;
                    //表明第i列已经被枚举过了
                    hashTable[i] = true;
                    string now;
                    for(int k=1; k<=n; k++)
                    {
                        //在第i列插入Q
                        if(k==i)
                        {
                            now.push_back('Q');
                        }
                        else
                        {
                            now.push_back('.');
                        }
                    }
                    temp.push_back(now);
                    ge(index+1,n,result,temp,hashTable,P);
                    temp.pop_back();
                    P[index] = -1;
                    //表明第i列还没有被枚举过
                    hashTable[i] = false;
                }
            }
        }
    }

    vector<vector<string>> solveNQueens(int n)
    {
        vector<vector<string>> result;
        vector<string> temp;
        bool hashTable[n+2];
        for(int i=0; i<n+2; i++)
        {
            hashTable[i] = false;
        }
        int P[n+2];
        for(int i=0; i<n+2; i++)
        {
            P[i] = -1;
        }
        ge(1,n,result,temp,hashTable,P);
        return result;
    }
};

标签:int,代码,51,越界,vector,result,数组,回溯,leetcode
来源: https://www.cnblogs.com/alphaprime/p/15661331.html