【BFS预处理】单个数字变化或同种数字变化使两串相同 UVALive 7263

Today is a rainy day. The temperature is apparently lower than yesterday. Winter is coming. It always leaves people feeling fatigued and tired.

Lee hasn’t prepared for winter yet. As he wakes up this morning, he looks out of the window. Yesterday’s shining sunlight can no longer be seen. It is dark outside. The sky looks so heavy that it may collapse down at any moment. Lee gets out of his bed, shakes his head slightly to make himself more awake. But it’s of no use for him. Then he goes to the restroom and washes up.

Lee has a class in fifteen minutes. If he sets out immediately, he may gets to the classroom on time. But he is not in the mood to do so. He decides to skip class and does something more interesting to train his mind.

He takes out a draft paper and writes a list of digits using a dice. It is obvious that the digits are all between 1 and 6. And then he applies two kind of modifications to the digits. The first kind is to modify one digit into another. The second kind is to modify one kind of digits into another. For example, he can modify “12123” to “12121” using the first kind of modification, or modify “12123” to “13133” using the second kind of modification. In the process of modification, all digits should be in {1,2,3,4,5,6};

After a few modifications, he feels tired but pleased. He’s got a list of digits which is very different from the original one. Thinking of the next thing to do, Lee becomes a little excited. He is going to figure out the least number of modifications to transform the final list back to the original one using the same rules.

Lee made it in a very short time. Can you do this like him?

 

Input

There are up to 100 test cases. For each test case, there are two lines containing two lists of digits, representing the original list and the final list in order. The digits are all between 1 and 6. It is guaranteed that two lists are of same length. The length will not be greater than 110.

Output

For each test case, output one integer, the answer.

 

Sample Input

22345611

12345611

2234562221

1234561221

2234562211

1234561111

22345622112

12345611111

654321654321654321654321

123456123456123456123456

 

Sample Output

1

2

3

3

1

1

 

 

尽可能使用第二种变换
BFS 预处理 1 2 3 4 5 6 可能更改为的数的可能性
原串中所有 1 2 3 4 5 6 变化成对应与预处理步数相同

#include <bits/stdc++.h>
using namespace std;

const int mn = 700000;

int mi[7] = {0, 100000, 10000, 1000, 100, 10, 1};

int cnt;
int step[mn], num[mn];
void bfs()		/// 预处理 123456 可更改为那些串并记录步数
{
	int st = 123456;
	memset(step, -1, sizeof step);
	step[st] = 0;
	num[++cnt] = st;

	queue <int> q;
	q.push(st);
	while (!q.empty())
	{
		int t = q.front();
		q.pop();

		int now[10];
		for (int i = 1; i <= 6; i++)
			now[i] = (t / mi[i]) % 10;

		for (int i = 1; i <= 6; i++)
		{
			for (int j = 1; j <= 6; j++)
			{ 	/// 将 i 变换为 j
				if (i == j)
					continue;

				int sum = 0;
				for (int k = 1; k <= 6; k++)
				{	/// 当前串的每一位 i 均变化
					if (now[k] == i)
						sum += j * mi[k];
					else
						sum += now[k] * mi[k];
				} 	// 变化后值为 sum
				if (step[sum] == -1) /// 步数尽可能小
				{
					step[sum] = step[t] + 1;
					num[++cnt] = sum;
					q.push(sum);
				}
			}
		}
	}
}
int main()
{
	bfs();

	char a[200], b[200];
	while (~scanf("%s %s", a, b))
	{
		int L = strlen(a);
		for (int i = 0; i < L; i++)
			a[i] -= '0', b[i] -= '0';

		int ans = L;
		for (int i = 1; i <= cnt; i++) // 使用第 i 种变化方式
		{
			int change[10];
			for (int j = 1; j <= 6; j++) // 1-6 分别更改为change
				change[j] = (num[i] / mi[j]) % 10;

			int res = step[num[i]];
			for (int j = 0; j < L; j++)
			{
				int to = change[b[j]];
				if (to != a[j]) // 逐个更改
					res++;
			}
			ans = min(ans, res);
		}
		printf("%d\n", ans);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值