封印之门
输出格式
如果蒜头君能开启封印之门,输出最少的操作次数。否则输出一行 −1。
样例输入
abcd
dddd
3
a b
b c
c d
样例输出
6
题目来源
思路
用最短路求两个字母转化的最小变化次数,权值为1
import java.util.*;
import java.math.*;
public class Main {
static int[][] step = new int[30][30];
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
for(int i=0; i<26; i++)
for(int j=0; j<26; j++)
if(i == j) step[i][j] = 0;
else step[i][j] = (int) 1e9;
String s = cin.next();
String str = cin.next();
if(s.equals(str)) {
System.out.println(0);
}else {
int n = cin.nextInt();
for(int i=0; i<n; i++) {
int a = cin.next().charAt(0)-'a';
int b = cin.next().charAt(0)-'a';
if(a != b)
step[a][b] = 1;
}
//floyd
for(int k=0; k<26; k++) {
for(int i=0; i<26; i++) {
for(int j=0; j<26; j++) {
step[i][j] =
Math.min(step[i][k] + step[k][j], step[i][j]);
}
}
}
int sum = 0;
boolean f = true;
for(int i=0; i<s.length(); i++) {
int a = s.charAt(i)-'a';
int b = str.charAt(i)-'a';
if(step[a][b] >= 1e9) {
f = false;
System.out.println(-1);
break;
}else {
sum += step[a][b];
}
}
if(f)
System.out.println(sum);
}
}
}