题目大意:
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
#include <stdio.h> #include <math.h> int x[15], y[15]; int n, sum; int place(int k) //判断这个点是否能放棋子 { int i; for (i = 1; i < k; i++) { if (x[i] == x[k] || abs(i - k) == abs(x[i] - x[k]))return 0; //判断是否有棋子和它在同一列或者在同一条斜线上 } return 1; } void dfs(int a) { int i; if (a > n)sum++; else { for (i = 1; i <= n; i++) { x[a] = i; if (place(a))dfs(a + 1); //dfs能够利用递归延伸出很多条路线,每天路线都代表不同的情况,当这一行每一列都不能放皇后的时候,不会回溯,这条路线直接被舍弃 } } } int main() { int i, j, n1; for (i = 1; i <= 10; i++) { n = i; sum = 0; dfs(1); y[i] = sum; } while (scanf("%d", &n1) != EOF, n1) { printf("%d\n", y[n1]); } return 0; }
2018-03-31