- 写代码前一定要写好架构和一些细节。
- 利用变量保存字符串的ascii码值之和进行可行性剪枝。
- 若两字符串中所含各字母个数相同,则ascii值之和相同,反之不然,但大部分都是,可以剪枝。
题目链接:http://bailian.openjudge.cn/practice/2192/
#include<cstdio>
#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cmath>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<ctime>
#include<vector>
#include<fstream>
#include<list>
using namespace std;
#define ms(s) memset(s,0,sizeof(s))
typedef unsigned long long ULL;
typedef long long LL;
const int INF = 1000000000;
char str1[210];
char str2[210];
char s[420];
int len1,len2;
int c1,c2;
bool dfs(int i, int j, int k)
{
if(s[k] == '\0')
return true;
if(str1[i] == '\0')
{
if(str2[j] == s[k])
{
if(dfs(i,j+1,k+1) == true)
return true;
}
else
return false;
}
else if(str2[j] == '\0')
{
if(str1[i] == s[k])
{
if(dfs(i+1,j,k+1) == true)
return true;
}
else
return false;
}
else
{
if(str1[i] != str2[j])
{
if(str1[i] == s[k])
{
if(dfs(i+1,j,k+1) == true)
return true;
}
else if(str2[j] == s[k])
{
if(dfs(i,j+1,k+1) == true)
return true;
}
else
return false;
}
else
{
if(str1[i] != s[k])
return false;
else
{
if(dfs(i+1,j,k+1) == true)
return true;
if(dfs(i,j+1,k+1) == true)
return true;
}
}
}
return false;
}
int main()
{
// freopen("F:\\data.txt","r",stdin);//方便调试
int t;
scanf("%d", &t);
getchar();
for(int i = 1; i <= t; ++i)
{
c1 = 0;
c2 = 0;
scanf("%s%s%s", str1,str2,s);
for(int i = 0; str1[i] != '\0'; i++)
c1+=str1[i];
for(int i = 0; str2[i] != '\0'; i++)
c1+=str2[i];
for(int i = 0; s[i] != '\0'; i++)
c2+=s[i];
if(c1!=c2 || dfs(0,0,0) == false)
printf("Data set %d: no\n",i);
else
printf("Data set %d: yes\n",i);
}
return 0;
}