POJ 2754 八皇后 解题报告
2009-02-06 15:14
417 查看
POJ 2754 八皇后 解题报告
编号:2754
考查点:递归、回溯
思路:我的方法有点搞笑,先模拟棋盘,递归找出92种可能性,处理后存储,然后根据后面的标准输入直接显示即可,难点一是递归条件,二是判断是否符合,在判断是否符合那漏了行列变换方向不一致的情况,幸亏后来一眼就看出来了.。
提交情况: 久仰八皇后问题大名,一直以为自己搞不定,昨天都没敢作这道题,结果今天看了会,竟然20分钟搞定,而且直接AC.汗.>
Source Code:
//POJ Grids 2754
#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]
)
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 09.02.06
编号:2754
考查点:递归、回溯
思路:我的方法有点搞笑,先模拟棋盘,递归找出92种可能性,处理后存储,然后根据后面的标准输入直接显示即可,难点一是递归条件,二是判断是否符合,在判断是否符合那漏了行列变换方向不一致的情况,幸亏后来一眼就看出来了.。
提交情况: 久仰八皇后问题大名,一直以为自己搞不定,昨天都没敢作这道题,结果今天看了会,竟然20分钟搞定,而且直接AC.汗.>
Source Code:
//POJ Grids 2754
#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]
)
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 09.02.06
相关文章推荐
- 百练-2754-八皇后-解题报告
- poj 3259 Wormholes spfa判断负环 解题报告
- POJ 1517 解题报告
- POJ 2739 解题报告
- POJ 2387 解题报告
- POJ-1753解题报告
- POJ - 1321 棋盘问题 解题报告
- POJ1001 Exponentiation解题报告
- POJ 3062 解题报告
- POJ 1001 解题报告
- POJ-2965题The Pilots Brothers' refrigerator解题报告
- poj 2284 That Nice Euler Circuit 解题报告
- POJ 2992 Divisors 解题报告(素因子统计)
- POJ 2828Buy Tickets 解题报告
- POJ 3233 Matrix Power Series 解题报告(子矩阵构造+矩阵快速幂)
- Polya 定理 (附POJ 1286 Necklace of Beads 解题报告)
- POJ 2531 Network Saboteur解题报告(随机化算法)
- poj解题报告——3253
- POJ 1001 解题报告 高精度大整数乘法模版
- POJ 2243解题报告