首页 > 代码库 > (DFS)noip2004——虫食算

(DFS)noip2004——虫食算

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 char a[4][28];
 5 bool vix[100],vi[28];
 6 int c[100],ge=1,an[100],t;
 7 bool judge1()
 8 {
 9     char x,y,z;
10     for(int i=t;i>0;i--)
11     {
12         x=a[1][i];y=a[2][i];z=a[3][i];
13         if(an[x]!=-1&&an[y]!=-1&&an[z]!=-1&&(an[x]+an[y])%t!=an[z]&&(an[x]+an[y]+1)%t!=an[z])
14             return false;
15     }
16     return true;
17 }
18 bool judge2()
19 {
20     char x,y,z;
21     int jin=0;
22     for(int i=t;i>0;i--)
23     {
24         x=a[1][i];y=a[2][i];z=a[3][i];
25         jin=jin+an[x]+an[y];
26         if(jin%t!=an[z])
27             return false;
28         jin/=t;
29     }
30     return true;
31 }
32 void dfs(int x)
33 {
34     int z=c[x];
35     if(!judge1())
36         return;
37     if(x>t)
38     {
39         if(judge2())
40         {
41             for(int i=0;i<t;i++)
42             {
43                 if(i)
44                     printf(" ");
45                 printf("%d",an[A+i]);
46 
47             }
48             exit(0);
49         }
50         else
51             return;
52     }
53 
54     else
55     {
56         for(int i=t-1;i>=0;i--)
57             if(!vi[i])
58             {
59                 vi[i]=true;
60                 an[z]=i;
61                 dfs(x+1);
62                 an[z]=-1;
63                 vi[i]=false;
64             }
65     }
66 }
67 int main()
68 {
69     scanf("%d",&t);
70     int i,j;
71     memset(an,-1,sizeof(an));
72     for(i=1;i<=3;i++)
73         scanf("%s",a[i]+1);
74     for(i=t;i>0;i--)
75         for(j=1;j<4;j++)
76             if(!vix[a[j][i]])
77             {
78                 vix[a[j][i]]=true;
79                 c[ge++]=a[j][i];
80             }
81     dfs(1);
82     return 0;
83 }

剪枝重要性的完美体现。

从各位开始扫,找到唯一的正确答案就exit(0)

(DFS)noip2004——虫食算