【HDOJ】1501 Zipper

DFS。注意剪枝,0ms。

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 #define False 0
 5 #define True  1
 6 #define MAXN 201
 7 
 8 char stra[MAXN], strb[MAXN], strc[MAXN<<1];
 9 int len1, len2, len3;
10 
11 int dfs(int e1, int e2, int e3) {
12     int i, flg = False;
13 
14     if (e1+e2+1 != e3) // 剩余长度必须相等
15         return False;
16 
17     if (e3 == -1)
18         return True;
19 
20     for (i=e1; i>=e3-e2-1; --i)  // 控制循环条件
21         if (stra[i] == strc[e3]) {
22             flg = dfs(i-1, e2, e3-1);
23             break;
24         }
25 
26     if (flg) return True;
27 
28     for (i=e2; i>=e3-e1-1; --i)  // 控制循环条件
29         if (strb[i] == strc[e3]) {
30             return dfs(e1, i-1, e3-1);
31             break;
32         }
33 
34     return False;
35 }
36 
37 int main() {
38     int case_n;
39     int i;
40 
41     scanf("%d", &case_n);
42 
43     for (i=1; i<=case_n; ++i) {
44         scanf("%s %s %s", stra, strb, strc);
45         len1 = strlen(stra);
46         len2 = strlen(strb);
47         len3 = strlen(strc);
48         printf("Data set %d: ", i);
49         if (len3 != len1+len2)
50             printf("no
");
51         else {
52             if ( dfs(len1-1, len2-1, len3-1) )
53                 printf("yes
");
54             else
55                 printf("no
");
56         }
57     }
58 
59     return 0;
60 }
原文地址:https://www.cnblogs.com/bombe1013/p/3769973.html