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,求出有多少种合法的放置方法。
你的任务是,对于给定的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;
}
水题也……