uva 1509 Leet

简介: 点击打开链接uva 1509 思路:dfs+回溯 分析: 1 给定两个字符串和值k,判断字符串1是否可以映射成字符串2. 2 题目说了一个字符最多可以映射为k个字符,那么我们就不能直接去枚举判断了,所以我们采用搜索的方法,因为每一个字符映...

点击打开链接uva 1509

思路:dfs+回溯
分析:
1 给定两个字符串和值k,判断字符串1是否可以映射成字符串2.
2 题目说了一个字符最多可以映射为k个字符,那么我们就不能直接去枚举判断了,所以我们采用搜索的方法,因为每一个字符映射的范围是确定的,那么我们通过搜索和回溯判断即可

代码:

#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn = 100;
char str[maxn] , mapStr[maxn];
map<char , char*>mp;
int k , len1 , len2;

int dfs(int pos1 , int pos2){
    if(pos1 == len1 && pos2 == len2)//最终成立的条件
       return 1;
    if(pos1 == len1 && pos2 != len2)//当pos1 = len1的时候不能在递归了
       return 0;
    if(mp[str[pos1]]){//如果已经有值
       char *tmp = mp[str[pos1]];
       int len = strlen(tmp);
       int tmpPos = pos2;
       for(int i = 0 ; i < len ; i++){
          if(tmp[i] != mapStr[tmpPos])
             return 0;
          tmpPos++;
       }
       if(dfs(pos1+1 , tmpPos))
          return 1;
    }
    else{//还没有值
       char tmp[maxn];
       for(int i = 1 ; i <= k ; i++){
          memset(tmp , '\0' , sizeof(tmp));
          int pos = 0;
          for(int j = pos2 ; j < pos2+i ; j++)
             tmp[pos++] = mapStr[j];
          mp[str[pos1]] = tmp;
          if(dfs(pos1+1 , pos2+i))
             return 1;
          mp[str[pos1]] = 0;//回溯
       }
    }
    return 0;
}

int main(){
    int Case;
    scanf("%d" , &Case);
    while(Case--){
        scanf("%d%*c" , &k);
        gets(str);
        gets(mapStr);
        len1 = strlen(str);
        len2 = strlen(mapStr);
        mp.clear();
        printf("%d\n" , dfs(0 , 0));
    }
    return 0;
}



目录
相关文章
|
机器学习/深度学习 网络架构
题解 UVA10212 【The Last Non-zero Digit.】
题目链接 这题在学长讲完之后和看完题解之后才明白函数怎么构造。这题构造一个$f(n)$$f(n)$ $=$ $n$除以 $2^{a}$ $*$ $5^{b}$ ,$a$ , $b$ 分别是 $n$ 质因数分解后$2,5$的个数。
1207 0
Uva - 12050 Palindrome Numbers【数论】
题目链接:uva 12050 - Palindrome Numbers   题意:求第n个回文串 思路:首先可以知道的是长度为k的回文串个数有9*10^(k-1),那么依次计算,得出n是长度为多少的串,然后就得到是长度为多少的第几个的回文串了,有个细节注意的是, n计算完后要-1! 下面给出A...
818 0
|
机器学习/深度学习
|
人工智能 BI 算法
uva 1203 Argus
点击打开链接uva 1203 思路: 优先队列 分析: 1 题目要求前k个事件的编号,我们利用优先队列来维护即可 2 优先队列保存的是一个struct,因此我们需要重载 s.
1280 0
uva 1394 - And Then There Was One
点击打开链接uva 1394 思路: 数学递推 分析: 1 题目是一道变形的约瑟夫环变形问题 2 网上看到一篇很好的数学递推法 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。
955 0
uva 1121 - Subsequence
点击打开链接uva 1121 思路:二分查找 分析: 1 题目要求找到一个最短的子序列长度并且这个子序列的和大于等于给定的s 2 如果按照常规的做法枚举起点和终点的话肯定是会超时的。
912 0