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
;
}
总结:首先,以为自己的代码会MemoryLE,结果竟然没超,呵呵.。然后就是相信自己.。
By Ns517
Time 09.02.06