N皇后问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4974 Accepted Submission(s): 2274
Problem 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>
int count;
void DFS(int );
int flag[10], map[10][10];
int N;
int main()
{
int i, j, temp[11];
for(N = 0; N < 11; N++) {
for(i = 0; i < N; i++) {
flag[i] = 0;
}
for(i = 0; i < N; i++) {
for(j = 0; j < N; j++) {
map[i][j] = 0;
}
}
count = 0;
for(i = 0; i < N; i++) {
flag[i] = 1;
map[0][i] = 1;
DFS(1);
map[0][i] = 0;
flag[i] = 0;
}
temp[N] = count;
}
while(scanf("%d", &N) && N) {
printf("%d\n", temp[N]);
}
return 0;
}
void DFS(int n)
{
int i, j, sum1, sum2, t, f;
if(n < N) {
for(j = 0; j < N; j++) {
if(flag[j] == 1) {
continue;
}
if(n-1 >= 0 && j-1 >= 0) {
if(map[n-1][j-1] == 1 || map[n][j-1] == 1 || map[n-1][j] == 1) {
continue;
}
}
if(n < N-1 && j < N-1) {
if(map[n+1][j+1] == 1 || map[n+1][j] == 1 || map[n][j+1] == 1) {
continue;
}
}
if(flag[j] == 0) {
flag[j] = 1;
map[n][j] = 1;
DFS(n+1);
map[n][j] = 0;
flag[j] = 0;
}
}
} else {
if(n == N) {
f = 1;
for(i = 0; i < N && f; i++) {
sum1 = 0;
sum2 = 0;
for(j = 0, t = i; j < N-i && f; j++, t++) {
sum1 += map[j][t];
sum2 += map[t][j];
if(sum1 > 1 || sum2 > 1) {
f = 0;
break;
}
}
}
for(i = 0; i < N && f; i++) {
sum1 = 0;
sum2 = 0;
for(j = 0, t = i; j <= i && f; j++, t--) {
sum1 += map[j][t];
sum2 += map[N-t-1][N-j-1];
if(sum1 > 1 || sum2 > 1) {
f = 0;
break;
}
}
}
if(f) {
count++;
}
}
}
}