题意:Harry上变形课,如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体。给你一张单词表,问你能否将B(Ball)转换为M(Mouse)。
思路:以单词词头,词尾为顶点建图,通过Floyd判断是否连通就行。
CODE:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int M = 1001;
int G[M][M];
void Floyd()
{
for(int k = 'a'; k <= 'z'; k++)
for(int i = 'a'; i <= 'z'; i++)
for(int j = 'a'; j <= 'z'; j++) G[i][j] = G[i][j] || (G[i][k] && G[k][j]);
}
int main()
{
char str[1001];
memset(G, 0, sizeof(G));
while(~scanf("%s", str))
{
if(!strcmp("0", str))
{
Floyd();
if(G['b']['m'] == 1)
{
printf("Yes.\n");
}
else printf("No.\n");
memset(G, 0, sizeof(G));
}
else
{
int len = strlen(str);
G[str[0]][str[len-1]] = 1;
}
}
return 0;
}
#include <cstdio>
#include <cstdlib>
using namespace std;
const int M = 1001;
int G[M][M];
void Floyd()
{
for(int k = 'a'; k <= 'z'; k++)
for(int i = 'a'; i <= 'z'; i++)
for(int j = 'a'; j <= 'z'; j++) G[i][j] = G[i][j] || (G[i][k] && G[k][j]);
}
int main()
{
char str[1001];
memset(G, 0, sizeof(G));
while(~scanf("%s", str))
{
if(!strcmp("0", str))
{
Floyd();
if(G['b']['m'] == 1)
{
printf("Yes.\n");
}
else printf("No.\n");
memset(G, 0, sizeof(G));
}
else
{
int len = strlen(str);
G[str[0]][str[len-1]] = 1;
}
}
return 0;
}