HDU-2533 N皇后问题

来源:互联网 发布:mac软件后缀名 编辑:程序博客网 时间:2024/04/29 19:27

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++;            }        }    }}


原创粉丝点击