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
",p++);
        else printf("Data set %d: no
",p++);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/luxiaoming/p/4705251.html