您的位置:首页 > 其它

HDU 2553 N皇后问题

2017-04-04 15:33 267 查看
//这道题首先想到的是枚举,但时间复杂度高。然后我用的回溯法,就是逐个尝试,如果合适就继续,否则就回溯到上一行继续
//最开始的代码,我开始一直用c++交的,但count变量有问题(我也不知道为啥,知道的可以评论下),然后我就改用G++交结果TTE(超时)
#include<iostream>
#include<math.h>
using namespace std;

int N,count;
int queenpos[10];
int Nqueen(int k);

int main()
{
while(cin>>N)
{
count=0;
if(N==0)
break;
cout<<Nqueen(0)<<endl;
}
return 0;
}

int Nqueen(int k)
{
if(k==N)//当0~k-1行都摆好,统计+1
{
count++;
}
int i,j;
for(i=0;i<N;i++)//在第k行逐个尝试0~N-1列
{
for(j=0;j<k;j++)
{
if(queenpos[j]==i||abs(queenpos[j]-i)==abs(k-j))//与0~k-1行有冲突(在同一列或者同一斜线)
break;
}
if(j==k)//如果j==k,说明上面并没有break,此位置可行
{
queenpos[j]=i;//记录第k行的棋子位置
Nqueen(k+1);//递归调用
}
}
return count;
}

//百度之后才知道,因为数据量比较大,需要预处理
#include<iostream>
#include<math.h>
using namespace std;

int n,count=0;
int queenpos[10];

int main()
{
void Nqueen(int );
int a[11];
for(int i=1;i<=10;i++)//预处理
{
n=i;
count=0;
Nqueen(0);
a
=count;//提前将结果存到数组里
}
while(cin>>n)
{
if(n==0)
break;
cout<<a
<<endl;
}
return 0;
}

void Nqueen(int k)
{
int i,j;
if(k==n)
count++;
for(i=0;i<n;i++)//在第k行逐个尝试0~N-1列
{
for(j=0;j<k;j++)
{
if(queenpos[j]==i||abs(queenpos[j]-i)==abs(k-j))
break;
}
if(j==k)
{
queenpos[j]=i;
Nqueen(k+1);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdu 2553 N皇后问题