标签:
中文题。
思路:用for循环往每一行里放皇后,x[]存的数是列数,要判断是否在同一斜线上,条件是abs(列数相减)==abs(行数相减):解释一下,如果两个点左低右高的话,那么他们的行列数之和相等;如果两个点左高右低的话,那么他们行数之差和列数之差相同;两个条件合并起来就是上面那个,当然也可以不作改动,直接判断两个条件。
AC代码:
#include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #define INF 0x3f3f3f3f using namespace std; int x[12],sum,ans[12],N; bool dfs(int n) { for(int i=1; i<n; i++) { if(x[i]==x[n]||abs(n-i)==abs(x[i]-x[n]))//判断条件 { return false; } } return true; } void TJ(int k) { if(k>N)//如果已经放了N个皇后,sum++; { sum++; } else { for(int i=1; i<=N; i++) { x[k]=i; if(dfs(k))//如果第N个皇后放的下去,继续下面递归;否则递归结束,进行下一个循环,典型回溯 { TJ(k+1); } } } } int main() { for(N=1; N<=10; N++)//先把10的表打好,直接查询。 { sum=0; TJ(1); ans[N]=sum; } int n; while(~scanf("%d",&n)&&n) { printf("%d\n",ans[n]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/qioalu/p/4905023.html