HDU 1501:(DFS)
不知道为什么一直超时,最后加了个剪枝就过了:合成单词的最后一个字母,应该至少和之前两个单词中的一个的最后一个字母相同
#include"cstdio" #include"cmath" #include"cstring" #include"iostream" #define MAXN 205 using namespace std; char arr[4][MAXN]; int len[4]; int vis[MAXN][MAXN]; int p=1,ok; void dfs(int x,int y,int z) { if(ok) return; if(z>=len[3]) {ok=1;return;} if(vis[x][y]) return; if(arr[1][x]==arr[3][z]){ vis[x][y]=1; dfs(x+1,y,z+1); vis[x][y]=0; } if(arr[2][y]==arr[3][z]){ vis[x][y]=1; dfs(x,y+1,z+1); vis[x][y]=0; } } int main() { int n; scanf("%d",&n); while(n--){ scanf("%s %s %s",arr[1],arr[2],arr[3]); for(int i=1;i<=3;i++) len[i]=strlen(arr[i]); ok=0; memset(vis,0,sizeof(vis)); if(arr[1][len[1]-1]==arr[3][len[3]-1]||arr[2][len[2]-1]==arr[3][len[3]-1]) dfs(0,0,0); if(ok) printf("Data set %d: yes\n",p++); else printf("Data set %d: no\n",p++); } return 0; }