封印之门
来自蓝桥杯
没什么难度。。。
刚刚才知道字母一共有26个,不是24个,WA了好久。。。
#include<iostream>
#include<cstring>
#include<string>
#define INF 0x3f3f3f3f // +∞
using namespace std;
int main(void)
{
int map[30][30]; //邻接矩阵
int k;
char a,b;
string s1,s2;
cin>>s1>>s2;
cin>>k;
for (int i=1;i<=26;i++)
for (int j=1;j<=26;j++)
if (i==j)
map[i][j]=0;
else
map[i][j]=INF;
for (int i=0;i<k;i++)
{
cin>>a>>b;
if (a!=b) //容易漏掉!
map[a-'a'+1][b-'a'+1]=1;
}
/*下面是Floyd核心代码*/
for (int q=1;q<=26;q++) //q表示“拐点”
for (int i=1;i<=26;i++) //i表示出发点
for (int j=1;j<=26;j++) //j表示目的地
if (i!=j)
if (map[i][q]+map[q][j]<map[i][j])
map[i][j]=map[i][q]+map[q][j];
long long sum=0;
for (int i=0;i<s1.size();i++)
sum+=map[s1[i]-'a'+1][s2[i]-'a'+1];
if (sum<INF)
cout<<sum;
else
cout<<"-1";
return 0;
}