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
只需要开一个数组,vis[i] 表示第i行的皇后要放在vis[i]这一列。
1 #include<cstdio> 2 #include<cstring> 3 int vis[12]; 4 int n; 5 int ans; 6 bool judge(int cnt,int t) 7 { 8 for(int i=1;i<cnt;i++) 9 if(vis[i]==t) 10 return false; 11 for(int i=1;i<cnt;i++) 12 if(t-vis[i]==cnt-i||vis[i]-t==cnt-i) 13 return false; 14 return true; 15 } 16 void dfs(int cnt) 17 { 18 if(cnt==n+1) 19 { 20 ans++; 21 return ; 22 } 23 for(int i=1;i<=n;i++) 24 { 25 if(judge(cnt,i)&&!vis[cnt]) 26 { 27 vis[cnt]=i; 28 dfs(cnt+1); 29 vis[cnt]=0; 30 } 31 } 32 33 } 34 int main() 35 { 36 while(scanf("%d",&n)) 37 { 38 if(n==0) 39 break; 40 memset(vis,0,sizeof(vis)); 41 ans=0; 42 dfs(1); 43 printf("%d ",ans); 44 } 45 return 0; 46 }
上面的代码tle了,所以我直接用它来打表。
1 #include<cstdio> 2 int vis[11]={0,1,0,0,2,10,4,40,92,352,724}; 3 int main() 4 { 5 int n; 6 while(scanf("%d",&n)) 7 { 8 if(n==0) 9 break; 10 printf("%d ",vis[n]); 11 } 12 return 0; 13 }