今天参加了郭崇山老师的练习赛,结果连第一道题都没做出来,尼玛十万级别的n皇后问题我说实在是不会啊……google了一下题解发现要用到遗传算法还有CSP最小冲突法什么的(http://blog.csdn.net/u013390476/article/details/50011261)心好累啊,把自己代码贴出来歇会先。
首先是用朴素的回溯法做的,毕竟好久没碰了,做出来先
//version 1回溯
#include <iostream>
#include <algorithm>
#define MAXN 100010
using namespace std;
bool hassolve=false;//是否解出
int n;
int line[MAXN];
void solve(int layer)//layer表示的是已经完成的最高层数
{
if(hassolve==true)
return;
if(layer==n)
{
for(int i=1;i<=n;i++)
{
cout<<i<<" "<<line[i]<<endl;
}
hassolve=true;
return;
}
int cur=layer+1;//当前所讨论的层数
//枚举
for(int i=1;i<=n;i++)
{
bool IsOk=true;
for(int j=1;j<=layer;j++)
{
if(line[j]==i||i-cur==line[j]-j||i+cur==line[j]+j)
{
IsOk=false;
break;
}
}
if(IsOk==true)
{
line[cur]=i;
solve(cur);
}
}
//消除枚举的影响,以便进行下一次枚举
}
int main(void)
{
cin>>n;
for(int