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
N行N列N个皇后,每行有一个皇后,先排第一行,找到合适的位置,用数组记录皇后在这一行的位置,标记整个列,其他的皇后都不能排在这一列,再判断是否有对角线不合适的情况。
1 #include<cstdio> 2 #include<string.h> 3 int n,key[11],map[11],ans,sum[11]; 4 void dfs(int x) 5 { 6 int i,j,k; 7 if(x == n+1) 8 { 9 ans++; 10 return ; 11 } 12 13 for(i = 1 ; i <= n ; i++) 14 { 15 if(key[i] == 0) 16 { 17 k=1; 18 map[x]=i; //记录皇后在x行的i列。 19 for(j = 1 ; j < x ; j++) 20 { 21 if(map[x] == map[j]+(x-j) || map[x] == map[j]-(x-j)) 22 { 23 k=0; 24 break; 25 } 26 } 27 if(k == 1) 28 { 29 key[i]=1; //标记整个列 30 dfs(x+1); 31 key[i]=0; //清除标记,开始下一种情况 32 } 33 } 34 35 } 36 } 37 int main() 38 { 39 for(n = 1 ; n <= 10 ;n++) 40 { 41 ans=0; 42 memset(map,0,sizeof(map)); 43 memset(key,0,sizeof(key)); 44 dfs(1); 45 sum[n]=ans; 46 } 47 while(scanf("%d",&n)&&n) 48 { 49 printf("%d ",sum[n]); 50 } 51 }