uva 10981 - String Morphing(记忆化+离散)

737 篇文章 0 订阅
232 篇文章 0 订阅

题目链接:uva 10981 - String Morphing


题目大意:给出一个规则,表示由两个字符可以变成一个字符(题目中的表),然后给出一个字符串A,问如何同过规则变换得到B串,输出过程。


解题思路:记忆化搜索,每次枚举当前串可以变换的位置,然后记录下来,用map映射设,有个剪枝就是找到B串就可以结束搜索了。然后在从B串回溯输出答案。


#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <map>

using namespace std;
map<string, string> v;
string s, e;

inline char cat (char a, char b) {
	if (a == 'a') {
		if (b == 'c') return 'a';
		return 'b';
	} else if (a == 'b') {
		return 'c' - b + 'a';
	} else {
		if (b == 'a') return 'a';
		return 'c';
	}
}

bool dfs(string c) {

	int len = c.length();

	if (len == 1)
		return c == e;

	for (int i = 1; i < len; i++) {
		string tmp = "";
		for (int j = 0; j < i-1; j++)
			tmp = tmp + c[j];
		tmp = tmp + cat(c[i-1], c[i]);
		for (int j = i + 1; j < len; j++)
			tmp = tmp + c[j];

		if (v.count(tmp))
			continue;

		v[tmp] = c;
		if (dfs(tmp))
			return true;
	}
	return false;
}

void put(string c) {
	if (c != s)
		put(v[c]);
	cout << c << endl;
}

int main () {
	int cas;
	scanf("%d", &cas);
	while (cas--) {
		cin >> s >> e;

		v.clear();

		if (dfs(s))
			put(e);
		else
			printf("None exist!\n");

		if (cas)
			printf("\n");
	}
	return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值