`

HDU 2553 N皇后问题 .

阅读更多

N皇后问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1753    Accepted Submission(s): 769

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
 

 

Author
cgf
 

 

Source
 

 

Recommend
lcy
 
经典问题,不过注意预处理之后先上交,唔系会超时{=       =}
贴代码得意:
4286478 2011-07-29 14:21:12 Accepted 2553 31MS 240K 1060 B C++ 10SGetEternal{(。)(。)}!
#include <iostream>
using namespace std;
#define MAXI 11

int maz[MAXI][MAXI];

void mark(int n, int x, int y, int add)
{
    int i, f = 1;
    
    for (i = 0;f ; i++)
    {
        f = 0;
        if (x - i >= 0 || y - i >= 0 ||  x + i < n || y + i < n) 
        {
            f = 1;
            if (x + i < n) maz[x + i][y] += add;
            if (y + i < n) maz[x][y + i] += add;
            if (x - i >= 0) maz[x - i][y] += add;
            if (y - i >= 0) maz[x][y - i] += add;
            if (x + i < n && y + i < n) maz[x + i][y + i] += add;
            if (x + i < n && y - i >= 0) maz[x + i][y - i] += add;
            if (x - i >= 0 && y + i < n) maz[x - i][y + i] += add;
            if (x - i >= 0 && y - i >= 0) maz[x - i][y - i] += add;
        }
    }
}

int DFS(int x, int n)
{
    int y, tsu = 0;

    if (x == n) return 1;
    for (y = 0; y < n; y++)
        if (!maz[x][y])
        {
            mark(n, x, y, 1);
            tsu += DFS(x + 1, n);
            mark(n, x, y, -1);
        }

    return tsu;
}

int main()
{
    int n, i, step[MAXI];

    for (i = 0; i < MAXI; i++)
        step[i] = DFS(0, i);

    while (scanf("%d", &n), n) printf("%d\n", step[n]);

    return 0;
}

 水题也……

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics