1. 程式人生 > >dfs HDU 1501

dfs HDU 1501

Problem Description

Given three strings, you are to determine whether the third string can be formed by combining the characters in the first two strings. The first two strings can be mixed arbitrarily, but each must stay in its original order.

For example, consider forming "tcraete" from "cat" and "tree":

String A: cat
String B: tree
String C: tcraete


As you can see, we can form the third string by alternating characters from the two strings. As a second example, consider forming "catrtee" from "cat" and "tree":

String A: cat
String B: tree
String C: catrtee

Finally, notice that it is impossible to form "cttaree" from "cat" and "tree".

Input

The first line of input contains a single positive integer from 1 through 1000. It represents the number of data sets to follow. The processing for each data set is identical. The data sets appear on the following lines, one data set per line.

For each data set, the line of input consists of three strings, separated by a single space. All strings are composed of upper and lower case letters only. The length of the third string is always the sum of the lengths of the first two strings. The first two strings will have lengths between 1 and 200 characters, inclusive.

Output

For each data set, print:

Data set n: yes

if the third string can be formed from the first two, or

Data set n: no

if it cannot. Of course n should be replaced by the data set number. See the sample output below for an example.

Sample Input
3
cat tree tcraete
cat tree catrtee
cat tree cttaree
 

Sample Output
Data set 1: yes
Data set 2: yes
Data set 3: no

 題意:

 給你3個字串A,B和C.問你由字串A和B的字元能否構成C字串.你可以任意組合A和B的字元,但是A中或B中所有字元間的相對位置不能改變.且C字元的個數=A字元個數+B字元個數.

程式碼:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=205;
char A[maxn],B[maxn],C[maxn*2];  //錯誤1,這裡C的陣列是兩倍長度
bool vis[maxn][maxn];            //vis陣列用來標記我們之前是否考慮過a,b的情況
bool dfs(int c,int a,int b)
{
    if(C[c]==0) return true;
    if(vis[a][b]) return false;
    vis[a][b]=1;
    if(C[c]==A[a])
    {
        if(dfs(c+1,a+1,b)) return true;
    }
    if(C[c]==B[b])
    {
        if(dfs(c+1,a,b+1)) return true;
    }
    return false;
}
int main()
{
    int T; scanf("%d",&T);
    for(int kase=1;kase<=T;kase++)
    {
        memset(vis,0,sizeof(vis));
        scanf("%s%s%s",A,B,C);
        if(dfs(0,0,0)) printf("Data set %d: yes\n",kase);
        else printf("Data set %d: no\n",kase);
    }
    return 0;
}