POJ 2754 八皇后 解题报告

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

    原文作者:端木
    原文地址: https://www.cnblogs.com/ns517/archive/2009/02/06/1385336.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞