题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2553
此题是深搜入门题,套用模板就可以,注意打表,避免TLE。
代码如下:
#include<iostream> #include<cstring> #include<math.h> #include<cstdio> #include<cstdlib> using namespace std; int vis[11][11]; int a[11]; int sum,n; bool check(int x) //检查此位置能否放置 { int i; int flag=1; for(i=0;i<x;i++) { if(a[i]==a[x]||abs(i-x)==abs(a[i]-a[x])) { flag=0; break; } } if(flag)return true; else return false; } void dfs(int cur) { int i; if(cur==n) { sum++; return ; } for(i=0;i<n;i++) { a[cur]=i; if(check(cur)&&!vis[cur][i]) { vis[cur][i]=1; dfs(cur+1); vis[cur][i]=0; } } return ; } int main() { int h[11]; for(n=0;n<11;n++)//若不打表,此题会超时 { sum=0; memset(vis,0,sizeof(vis)); dfs(0); h[n]=sum; } while(scanf("%d",&n),n) { printf("%d\n",h[n]); } return 0; }
原文:http://blog.csdn.net/pwaiyuan/article/details/23613805