uva1509(暴力dfs)

来源:互联网 发布:下载会声会影软件 编辑:程序博客网 时间:2024/06/15 03:23

题意:

给出两个字符串,第一个字符串中的每个字符(只包括小写字母)最多可以变成k(k<=3)个字符(不一定是小写字母),相同字母要变成相同的字符,问由第一个串变成第二个串合不合法。


思路:

串的长度只有15,直接暴力,用dfs+回溯去枚举所有情况。


代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<queue>#include<vector>#include<map>#include<stack>#include<cmath>#include<cstdlib>#include<climits>#include<sstream>using namespace std;char st[100],en[100];char maps[26][4],tmp[4];int dfs(int k, int p1, int p2 ,int l1, int l2){    if(p1==l1&&p2==l2)        return 1;    if(p1==l1||p2==l2)        return 0;for(int i=0;i<k;i++){if(p2+i<l2){memset(tmp,0,sizeof tmp);for(int j=0;j<=i;j++)tmp[j]=en[p2+j];int flag=0;if(strcmp(maps[st[p1]-'a'],"")==0){flag=1;strcpy(maps[st[p1]-'a'],tmp);}if(flag||strcmp(maps[st[p1]-'a'],tmp)==0){if(dfs(k,p1+1,p2+i+1,l1,l2))return 1;}if(flag)strcpy(maps[st[p1]-'a'],"");}}return 0;}int main(){    int t;scanf("%d",&t);while (t--)    {int k;scanf("%d%s%s",&k,st,en);int len1=strlen(st);int len2=strlen(en);        if(len2>3*len1)        {cout<<0<<endl;            continue;        }        for(int i=0;i<26;++i)            strcpy(maps[i],"");int ans=dfs(k,0,0,len1,len2);cout<<ans<<endl;    }    return 0;}


0 0
原创粉丝点击