N皇后問題
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++;
}
}
}
}