POJ 2754 八皇后 解题报告
POJ 2754 八皇后 解题报告
编号:2754
考查点:递归、回溯
思路:我的方法有点搞笑,先模拟棋盘,递归找出92种可能性,处理后存储,然后根据后面的标准输入直接显示即可,难点一是递归条件,二是判断是否符合,在判断是否符合那漏了行列变换方向不一致的情况,幸亏后来一眼就看出来了.。
提交情况: 久仰八皇后问题大名,一直以为自己搞不定,昨天都没敢作这道题,结果今天看了会,竟然20分钟搞定,而且直接AC.汗.>
Source Code:
#include <iostream>
using namespace std;
int qnum[93];
void Display(bool flag[][8])
{
static int num = 0;
num++;
int temp = 0;
for (int i=0;i<8;i++)
{
for (int j=0;j<8;j++)
{
if (flag[i][j])
temp = temp*10+j+1;
}
}
qnum[num] = temp;
}
bool Search(bool flag[][8],int m,int n)
{
for (int i=0;i<7;i++)
{
if (flag[m][i])
return false;
if (flag[i][n])
return false;
}
for (int i=m,j=n;i>=0&&j>=0;i--,j--)
{
if (flag[i][j])
return false;
}
for (int i=m,j=n;i<=7&&j<=7;i++,j++)
{
if (flag[i][j])
return false;
}
for (int i=m,j=n;i>=0&&j<=7;i--,j++)
{
if (flag[i][j])
return false;
}
for (int i=m,j=n;i<=7&&j>=0;i++,j--)
{
if (flag[i][j])
return false;
}
return true;
}
void Queen(bool flag[][8],int m)
{
if (m==8)
{
Display(flag);
return;
}
else
{
for (int i=0;i<8;i++)
{
if (Search(flag,m,i))
{
flag[m][i] = true;
Queen(flag,m+1);
flag[m][i] = false;
}
}
}
}
int main()
{
bool flag[8][8];
int m,n;
m = n = 0;
memset(flag,false,sizeof flag);
Queen(flag,m);
int count;
cin>>count;
while (count--)
{
int m;
cin>>m;
cout<<qnum[m]<<endl;
}
return 0;
}
using namespace std;
int qnum[93];
void Display(bool flag[][8])
{
static int num = 0;
num++;
int temp = 0;
for (int i=0;i<8;i++)
{
for (int j=0;j<8;j++)
{
if (flag[i][j])
temp = temp*10+j+1;
}
}
qnum[num] = temp;
}
bool Search(bool flag[][8],int m,int n)
{
for (int i=0;i<7;i++)
{
if (flag[m][i])
return false;
if (flag[i][n])
return false;
}
for (int i=m,j=n;i>=0&&j>=0;i--,j--)
{
if (flag[i][j])
return false;
}
for (int i=m,j=n;i<=7&&j<=7;i++,j++)
{
if (flag[i][j])
return false;
}
for (int i=m,j=n;i>=0&&j<=7;i--,j++)
{
if (flag[i][j])
return false;
}
for (int i=m,j=n;i<=7&&j>=0;i++,j--)
{
if (flag[i][j])
return false;
}
return true;
}
void Queen(bool flag[][8],int m)
{
if (m==8)
{
Display(flag);
return;
}
else
{
for (int i=0;i<8;i++)
{
if (Search(flag,m,i))
{
flag[m][i] = true;
Queen(flag,m+1);
flag[m][i] = false;
}
}
}
}
int main()
{
bool flag[8][8];
int m,n;
m = n = 0;
memset(flag,false,sizeof flag);
Queen(flag,m);
int count;
cin>>count;
while (count--)
{
int m;
cin>>m;
cout<<qnum[m]<<endl;
}
return 0;
}
总结:首先,以为自己的代码会MemoryLE,结果竟然没超,呵呵.。然后就是相信自己.。
By Ns517
Time