A - N皇后问题
Time Limit:1000MS
Memory Limit:32768KB
64bit IO Format:%I64d & %I64u
Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
#include
<stdio.h>
#include
<math.h>
#include
<string.h>
int a
[
20
];
//数组下标表示皇后所在行,数组值表示皇后所在列
int n
;
//皇后数目
int count
;
int book
[
20
];
int ans
[
20
];
void dfs
(int k
)
{
int i
,j
,flag
;
if
(k
==n
+1
)
{
count
++;
return
;
}
for
(i
=
1
;i
<=n
;i
++)
//对第k行的每一列进行探测
{
if
(book
[i
]==
0
)
//该列位置可以放皇后
{
a
[k
]=i
;
//第k行第i列放置皇后
flag
=
1
;
for
(j
=
1
;j
<=k
-1
;j
++)
{
if
(fabs
(j
-k
)==fabs
(a
[k
]-a
[j
]))
{
flag
=
0
;
break
;
}
}
if
(flag
)
{
book
[i
]=
1
;
dfs
(k
+1
);
book
[i
]=
0
;
}
}
}
return
;
}
int main
()
{
for
(int i
=
1
;i
<=
10
;i
++)
{
n
=i
;
count
=
0
;
memset
(a
,
0
,sizeof
(a
));
memset
(book
,
0
,sizeof
(book
));
dfs
(
1
);
ans
[i
]=count
;
}
while
(~scanf
(
"%d"
,&n
))
{
if
(n
==
0
)
break
;
printf
(
"%d
\n
"
,ans
[n
]);
}
return
0
;
}