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
11
一、大致题意
给出两个包含数字(1-6)的串。现有两种操作。
1、将串中一个位置的数字变成(1-6)之间的一个数字。
2、将串中所有位置上的数字 i 变成(1-6)之间的所有数字。
询问最少需要多少次操作可以把串s2变化为s1。
二、大致思路
BFS跑出123456到状态所需的操作次数。那么只需要遍历每一种情况然后,那些经过变化后和s1仍然不同的就是需要单次操作l来改变的部位。
三、代码
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
typedef long long LL;
char s1[150], s2[150];
int step[700000],temp[10];
int reall[700000];
int ind;
bool vis[700000];
void To_arr(int x)
{
temp[1] = x / 100000; temp[2] = (x / 10000) % 10;
temp[3] = (x / 1000) % 10;temp[4]= (x / 100) % 10;
temp[5] = (x / 10) % 10; temp[6] = x % 10;
}
int To_num(int x[])
{
int ret = 0;
for (int i = 1; i <= 6; i++)
{
ret *= 10;
ret += x[i];
}
return ret;
}
void PreBFS()
{
memset(vis, false, sizeof(vis));
for (int i = 111111; i <= 666666; i++)step[i] = inf;
ind = step[123456] = 0;
reall[ind++] = 123456;
vis[123456] = true;
queue<int>q;
q.push(123456);
while (!q.empty())
{
int t = q.front();
q.pop();
for (int i = 1; i <= 6; i++)
{
for (int j = 1; j <= 6; j++)
{
To_arr(t);
for (int k = 1; k <= 6; k++)
{
if (temp[k] == i)temp[k] = j;
}
int nxt = To_num(temp);
if (!vis[nxt]&&nxt!=t)
{
q.push(nxt);
vis[nxt] = true;
step[nxt] = min(step[nxt], step[t] + 1);
reall[ind++] = nxt;
}
}
}
}
}
void print()
{
for (int i = 0; i <ind; i++)
{
printf("%d %d\n", reall[i], step[reall[i]]);
}
}
int main()
{
PreBFS();
//print();
while (scanf("%s", s1) != EOF)
{
scanf("%s", s2);
int len = strlen(s1);
int ans = inf;
for (int i = 0; i < ind; i++)
{
int cnt = 0;
To_arr(reall[i]);
for (int j = 0; j < len; j++)
{
if (s1[j] - '0' != temp[s2[j] - '0'])cnt++;
}
ans = min(ans, cnt + step[reall[i]]);
}
printf("%d\n", ans);
}
}