这题如果没有剪枝,时间成本会剧烈增加,直接超时
#include<iostream>
#include<cstdio>
#include<cstring>
#pragma(disable: 4996)
using namespace std;
const int maxn = 205;
char a[maxn], b[maxn], c[2 * maxn];
int vis[maxn][maxn], ai, bi, ci;//vis作为剪枝数组
bool flag;
void judge() {
if (flag == true)
return;
if (ci == strlen(c)) {
flag = true;
return;
}
if (vis[ai][bi] == 1)
return;
vis[ai][bi] = 1;
if (c[ci] == a[ai]) {
ai++;
ci++;
judge();
ai--;
ci--;
}
if (c[ci] == b[bi]) {
bi++;
ci++;
judge();
bi--;
ci--;
}
return;
}
int main() {
int t;
while (cin >> t) {
int p = 1;
while (t--) {
ai = 0;
bi = 0;
ci = 0;
flag = false;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
memset(vis, 0, sizeof(vis));
//memset(c0, 0, sizeof(c0));
scanf("%s %s %s", &a, &b, &c);
judge();
if(flag == false)
cout << "Data set " << p++ << ": no" << endl;
else
cout << "Data set " << p++ << ": yes" << endl;
}
}
}