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][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 09.02.06