http://acm.hdu.edu.cn/showproblem.php?pid=2553
8皇后 经典回溯题
用负数做为数组下标,稍微方便点
不打表就TLE了
Orz matrix67大牛的位运算版本
我的代码
1 #include <stdio.h>
2 #include <string.h>
3 int v1[20],v2[20],vv3[20],*v3=vv3+10;
4 int n,ans[20],s;
5 void dfs(int x)
6 {
7 if (x>n) {s++; return;}
8 int i;
9 for (i=1;i<=n;i++)
10 if (!v1[i] && !v2[i+x] && !v3[i-x])
11 {
12 v1[i]=v2[i+x]=v3[i-x]=1;
13 dfs(x+1);
14 v1[i]=v2[i+x]=v3[i-x]=0;
15 }
16 }
17 int main()
18 {
19 memset(v1,0,sizeof(v1));
20 memset(v2,0,sizeof(v2));
21 memset(vv3,0,sizeof(vv3));
22 for (int i=1;i<=10;i++) ans[i]=-1;
23 while (scanf("%d",&n),n)
24 {
25 s=0;
26 if (ans[n]<0) dfs(1),ans[n]=s;
27 printf("%d\n",ans[n]);
28 }
29
30 }