蒜头君被暗黑军团包围在一座岛上,所有通往近卫军团的路都有暗黑军团把手。幸运的是,小岛上有一扇上古之神打造的封印之门,可以通往近卫军团,传闻至今没有人能解除封印。
封印之门上有一串文字,只包含小写字母,有 k种操作规则,每个规则可以把一个字符变换成另外一个字符。经过任意多次操作以后,最后如果能把封印之门上的文字变换成解开封印之门的文字,封印之门将会开启。
蒜头君战斗力超强,但是不擅计算,请你帮忙蒜头君计算至少需要操作多少次才能解开封印之门。
输入格式
输入第一行一个字符串,长度不大于 1000,只包含小写字母,表示封印之门上的文字。
输入第二行一个字符串,只包含小写字母,保证长度和第一个字符串相等,表示能解开封印之门的文字。
输入第三行一个整数 k(0≤k≤676)。
接下来 k 行,每行输出两个空格隔开的字符 a, b,表示一次操作能把字符 a 变换成字符 b。
输出格式
如果蒜头君能开启封印之门,输出最少的操作次数。否则输出一行 −1。
样例输入
abcd dddd 3 a b b c c d
样例输出
6
转化成图和矩阵的方法。
/*
* 封印之门,转化为图的问题
*/
package lanqiao;
import java.util.Scanner;
public class fengyin_door {
public static int min(int a,int b) {
if(a>b) a=b;
return a;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//利用图和矩阵的思想解决
int N=1010;
int inf=999999;
int[][] g=new int[30][30];//26阶矩阵
char[] fengyin=new char[N];
char[] jiefeng=new char[N];
int x;
int len;
for(int i=0;i<26;++i)
for(int j=0;j<26;++j) {
if(i==j) {
g[i][j]=0;//自己到自己则置为0
}
else {
g[i][j]=inf;//初始无此路径,则无穷
}
}
Scanner cin=new Scanner(System.in);
fengyin=cin.next().toCharArray();
len=fengyin.length;
jiefeng=cin.next().toCharArray();
char a,b;
x=cin.nextInt();
for(int i=0;i<x;i++) {
a=cin.next().charAt(0);
b=cin.next().charAt(0);
if(a!=b) g[a-'a'][b-'a']=1;//a-b是一条路径则置1
}
for(int k=0;k<26;++k)
for(int i=0;i<26;++i)
for(int j=0;j<26;++j) {
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);//和inf(无穷)比更新更小的;
}
int sum=0;
for(int i=0;i<len;++i) {
if(g[fengyin[i]-'a'][jiefeng[i]-'a']>=inf) {
sum=-1;
break;
}
else {
sum+=g[fengyin[i]-'a'][jiefeng[i]-'a'];
}
}
System.out.println(sum);
}
}