【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\n"); 51 else { 52 if ( dfs(len1-1, len2-1, len3-1) ) 53 printf("yes\n"); 54 else 55 printf("no\n"); 56 } 57 } 58 59 return 0; 60 }