回溯法(1)--N皇后问题

C++实现N皇后问题

N皇后问题非常简单,但是有几个注意问题:
  1. N皇后问题,每一个N解不唯一,注意要求是求出所有解还是一个解
  2. 当某一行无法放置皇后时,我们没有必要进行下一行的检验,而是进行回溯,减少开销
  3. 当回溯之后,记得将回溯到的行所在的皇后换到下一个列。否则我们就没有在回溯之后进行下一个运算,只是又进行了与之前相同的运算

以下是代码

#include
#include
#include
using namespace std;

int n;
vector<int> x(n+1);//x[k]对应第k行元素放置位置
int index=1;

bool place(int k)
{
     //判断第k行元素是否可以放到第x[k]列上
    for(int i=1;i<k;i++)
    {
     
        if((abs(x[i]-x[k])==abs(i-k))||x[i]==x[k])
            return false;
    }
    return true;
}
void print(const vector<int>&x)
{
     //打印结果
    cout<<"NO."<<index<<" : ";
    for(int i=1;i<=n;i++)
        cout<<x[i]<<" ";
    cout<<endl;
    index++;
}
int main()
{
     
    cin>>n;
    x[1]=0;
    int k=1;
    while(k>0)
    {
     
    	//非常关键
        x[k]++;///移动到下一列,进行下次检验
        while(x[k]<=n&&!place(k))
            x[k]++;
        if(x[k] <= n)//如果可以将第k行的皇后放置到x[k]列上
        {
     
            if(k == n)//如果到达最后一行,说明已经处理完毕
                print(x);///到达最后一行,打印结果
            else
                k++,x[k]=0;///下一行
        }
        else//如果x[k]>n,代表未找到相应的列放置皇后
            k--;//回溯到上一行,不再继续向下,减少开销,
            //不再继续向下的方式是回溯到上一行后,将上一行所在位置向右放置
    }
    return 0;
}

你可能感兴趣的:(算法与数据结构)