百炼 Zipper 剪枝

来源:互联网 发布:mac dock栏恢复默认 编辑:程序博客网 时间:2024/04/30 04:36
  1. 写代码前一定要写好架构和一些细节。
  2. 利用变量保存字符串的ascii码值之和进行可行性剪枝。
  3. 若两字符串中所含各字母个数相同,则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;}
1 0
原创粉丝点击