uva1509(暴力dfs)
生活随笔
收集整理的這篇文章主要介紹了
uva1509(暴力dfs)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意:
給出兩個字符串,第一個字符串中的每個字符(只包括小寫字母)最多可以變成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; }總結(jié)
以上是生活随笔為你收集整理的uva1509(暴力dfs)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uva1507(状态压缩+dfs)
- 下一篇: uva1511(找规律。。。)