題目描述:
變形課上PIPI碰到了一點小麻煩,因爲他並不能夠記住所有的咒語而隨意的將一個棒球變成刺蝟什麼的,但是他發現了變形咒語的一個統一規律:如果咒語是以a開頭b結尾的一個單詞,那麼它的作用就恰好是使A物體變成B物體.
PIPI已經將他所會的所有咒語都列成了一個表,他想讓你幫忙計算一下他是否能完成老師的作業,將一個B(ball)變成一個M(Mouse)。
輸入:
測試數據有多組。每組有多行,每行一個單詞,僅包括小寫字母,是PIPI所會的所有咒語,每個單詞長度不超過15.
數字0表示一組輸入結束.
輸出:
如果PIPI可以完成他的作業,就輸出"Yes.",否則就輸出"No."
樣例輸入:
so
soon
river
goes
them
got
moon
begin
big
0
樣例輸出:
Yes.
題目來源:PIPI的變形課
分析: 利用鄰接表來BFS,注意輸出是後面有一個小點 .
#include<bits/stdc++.h>
using namespace std;
vector<int> vec[26];
queue<int> q;
int vis[26];
char ch[16];
bool flag;
void bfs()
{
q.push('b'-'a');
while(!q.empty()){
int now = q.front();
if(now==('m'-'a')){
flag = true;
return;
}
q.pop();
vis[now] = 1;
for(int i=0;i<vec[now].size();i++){
if(vis[vec[now][i]]==0){
q.push(vec[now][i]);
vis[vec[now][i]] = 1;
}
}
}
return;
}
int main()
{
while(scanf("%s",ch)!=EOF){
memset(vis,0,sizeof(vis));
for(int i=0;i<26;i++)
vec[i].clear();
while(!q.empty()){
q.pop();
}
flag = false;
vec[ch[0]-'a'].push_back(ch[strlen(ch)-1]-'a');
while(scanf("%s",ch)!=EOF){
if(ch[0]=='0')
break;
vec[ch[0]-'a'].push_back(ch[strlen(ch)-1]-'a');
}
bfs();
if(flag) cout<<"Yes."<<endl;
else cout<<"No."<<endl;
}
return 0;
}