题目链接:HDU 2553
Problem Description
在 $N*N$ 的方格棋盘放置了 $N$ 个皇后,使得它们不相互攻击(即任意 $2$ 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 $45$ 角的斜线上。
你的任务是,对于给定的 $N$,求出有多少种合法的放置方法。
共有若干行,每行一个正整数 $N\le 10$,表示棋盘和皇后的数量;如果 $N=0$,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Output
Solution
DFS
每行放置一个,位置用 $pos[i]$ 表示,这样就不用处理行冲突的问题;保证每行的 $pos$ 不同,就可以解决列冲突的问题;最后要保证不在同一斜线上。
注意此题要打表。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <bits/stdc++.h> using namespace std;
int cnt = 0, n; int pos[110];
void nqueen(int k) { if(k == n) { ++cnt; return; }
for(int i = 0; i < n; ++i) { int j; for(j = 0; j < k; ++j) { if(pos[j] == i || abs(pos[j] - i) == abs(j - k)) { break; } } if(j == k) { pos[k] = i; nqueen(k + 1); } } }
int main() { int a[11] = {0}; for(n = 1; n <= 10; ++n) { cnt = 0; nqueen(0); a[n] = cnt; } while(~scanf("%d",&n) && n) { printf("%d\n", a[n]); } return 0; }
|