H.封印之门
蒜头君被暗黑军团包围在一座岛上,所有通往近卫军团的路都有暗黑军团把手。幸运的是,小岛上有一扇上古之神打造的封印之门,可以通往近卫军团,传闻至今没有人能解除封印。
封印之门上有一串文字,只包含小写字母,有 k 种操作规则,每个规则可以把一个字符变换成另外一个字符。经过任意多次操作以后,最后如果能把封印之门上的文字变换成解开封印之门的文字,封印之门将会开启。
蒜头君战斗力超强,但是不擅计算,请你帮忙蒜头君计算至少需要操作多少次才能解开封印之门。
输入格式
输入第一行一个字符串,长度不大于 1000,只包含小写字母,表示封印之门上的文字。
输入第二行一个字符串,只包含小写字母,保证长度和第一个字符串相等,表示能解开封印之门的文字。
输入第三行一个整数 k(0≤k≤676)。
接下来 k 行,每行输出两个空格隔开的字符 a, b,表示一次操作能把字符 a 变换成字符 b。
输出格式
如果蒜头君能开启封印之门,输出最少的操作次数。否则输出一行 −1。
样例输入
abcd
dddd
3
a b
b c
c d
样例输出
6
问题思路:用Floyd把两个字母转换的最小次数求出来,不过有一个坑点,已标红,输入可能两点相同,靠
#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
int main()
{
char s1[1010],s2[1010];
int a[30][30];
char x,y;
int n;
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
cin >> s1 >> s2;
cin >> n;
getchar();
for(int i = 0; i <= 26; i++)
for(int j = 0; j <= 26; j++)
if (i != j)
a[i][j] = inf;
else a[i][j] = 0;
for(int i = 0; i < n; i++){
cin >> x >> y;
getchar();
if (x != y)
a[x-'a'][y-'a'] = 1;
}
for(int k = 0; k < 26; k++){
for(int i = 0; i < 26; i++){
for(int j = 0; j < 26; j++){
if (i == j)
continue;
if (a[i][j] > a[i][k]+a[k][j])
a[i][j] = a[i][k]+a[k][j];
}
}
}
long long int sum = 0;
for(int i = 0; i < strlen(s1); i++){
sum += a[s1[i]-'a'][s2[i]-'a'];
}
if (sum < inf)
cout << sum << endl;
else cout << "-1" << endl;
return 0;
}