题意:如上图,即给出一定数量的字母转化法则,判断是否可以通过一定次数的操作,将b转化成m。
算法:BFS
问题:BFS第一次一遍过,有点激动,记录一下。
思路:把每个输入的法则通过结构体数组保存,利用BFS算法相当于遍历就行了。
代码:ac
#include<bits/stdc++.h>
using namespace std;
struct turn {
char fr;/*首字母*/
char to;/*尾字母*/
int flag;/*是否使用过*/
}s[10000];
char a[10000];
int cnt;/*记录法则数量*/
void bfs();
int main()
{
while (scanf("%s", a) != EOF) {
int len = strlen(a);
cnt = 0;
s[++cnt].fr = a[0];
s[cnt].to = a[len - 1];
s[cnt].flag = 0;
while (++cnt) {
scanf("%s", a);
if (a[0] == '0')break;
len = strlen(a);
s[cnt].fr = a[0];
s[cnt].to = a[len - 1];
s[cnt].flag = 0;
}
bfs();
}
return 0;
}
void bfs()
{
queue<turn>qu;
turn cur, nex;
cur.to = 'b';
cur.flag = 1;
qu.push(cur);
while (!qu.empty()) {
cur = qu.front();
qu.pop();
if (cur.to == 'm') {
printf("Yes.\n");
return;
}
for (int i = 1; i <= cnt - 1; i++) {
if (s[i].fr == cur.to && s[i].flag == 0) {
nex = s[i];
s[i].flag = 1;
qu.push(nex);
}
}
}
printf("No.\n");
}