藍橋杯 封印之門

2021-08-17 20:26:30 字數 1231 閱讀 7435

h. 封印之門

蒜頭君被暗黑軍團包圍在一座島上,所有通往近衛軍團的路都有暗黑軍團把手。幸運的是,小島上有一扇上古之神打造的封印之門,可以通往近衛軍團,傳聞至今沒有人能解除封印。

封印之門上有一串文字,只包含小寫字母,有 k 種操作規則,每個規則可以把乙個字元變換成另外乙個字元。經過任意多次操作以後,最後如果能把封印之門上的文字變換成解開封印之門的文字,封印之門將會開啟。

蒜頭君戰鬥力超強,但是不擅計算,請你幫忙蒜頭君計算至少需要操作多少次才能解開封印之門。

輸入格式

輸入第一行乙個字串,長度不大於 1000,只包含小寫字母,表示封印之門上的文字。

輸入第二行乙個字串,只包含小寫字母,保證長度和第乙個字串相等,表示能解開封印之門的文字。

輸入第三行乙個整數 k(0≤k≤676)。

接下來 k 行,每行輸出兩個空格隔開的字元 a, b,表示一次操作能把字元 a 變換成字元 b。

輸出格式

如果蒜頭君能開啟封印之門,輸出最少的操作次數。否則輸出一行 −1。

樣例輸入

abcd

dddd

3a b

b cc d

樣例輸出

思路:字元a可以轉化為字元b表示為ab之間距離為1,變為最短路問題,因為求串s1和s2不同的字元之間所有最短路,所以選擇弗洛伊德。

**:#include

using namespace std;

const int maxn = 1050;

const int inf = 999999;

char s1[maxn], s2[maxn];

int len, k, vis[26], g[26][26], ans, f;

int main()

else}}

memset(vis, 0, sizeof vis);

for(int i = 0;i < k;i++)

f = 0;

for(int k = 0;k < 26;k++)

for(int i = 0;i < 26;i++)

for(int j = 0;j < 26;j++)

for(int i = 0;i < len;i++)

else

ans += g[c][d];}}

if(f)

printf("-1\n");

else

printf("%d\n", ans);

}return 0;

}

封印之門(最短路)

蒜頭君被暗黑軍團包圍在一座島上,所有通往近衛軍團的路都有暗黑軍團把手。幸運的是,小島上有一扇上古之神打造的封印之門,可以通往近衛軍團,傳聞至今沒有人能解除封印。封印之門上有一串文字,只包含小寫字母,有 k 種操作規則,每個規則可以把乙個字元變換成另外乙個字元。經過任意多次操作以後,最後如果能把封印之...

封印之門 Floyd演算法應用

來自藍橋杯 計蒜客傳送門 沒什麼難度。剛剛才知道字母一共有26個,不是24個,wa了好久。include include include define inf 0x3f3f3f3f using namespace std intmain void 下面是floyd核心 for int q 1 q 2...

計蒜客 封印之門(floyd)

封印之門 蒜頭君被暗黑軍團包圍在一座島上,所有通往近衛軍團的路都有暗黑軍團把手。幸運的是,小島上有一扇上古之神打造的封印之門,可以通往近衛軍團,傳聞至今沒有人能解除封印。封印之門上有一串文字,只包含小寫字母,有 kk k 種操作規則,每個規則可以把乙個字元變換成另外乙個字元。經過任意多次操作以後,最...