题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1181
方法:以所有咒语看做一条起点为首字母,终点为末字母的有向边来建立有向图。然后在图中判断目标路径是否存在,判断的方法是 :如果目标路径的起点和终点不都在图中出现,则直接得出不存在该路径,否则广搜索来判断目标路径是否存在。
感想:简单题目,但后期需要频繁重温代码以熟悉广搜代码的写法。该题使用的是邻接矩阵。
代码:
View Code
#include<iostream> #include<queue> using namespace std; bool matrix[26][26]; bool visited[26]; bool inGraph[26]; bool BFSSearch(int x,int y) { queue<int> q; q.push(x); visited[x] = true; bool re = false; while(!q.empty()) { int temp = q.front(); q.pop(); if(temp==y) { re=true; break; } else { for(int i =0;i<26;i++) { if(matrix[temp][i] && !visited[i]) { visited[i] = true; q.push(i); } } } } return re; } int main() { char s[100]; memset(matrix,false,sizeof(matrix)); memset(visited,false,sizeof(visited)); memset(inGraph,false,sizeof(inGraph)); while(scanf("%s",s)!=EOF) { if( !(strlen(s)==1 && s[0]=='0') ) { int len = strlen(s); int st = s[0]-97; int ed = s[len-1]-97; matrix[st][ed] = true; inGraph[st]=inGraph[ed] =true; } else { if(!inGraph['b'-97]) cout<<"No."<<endl; else if(!inGraph['m'-97]) cout<<"No."<<endl; else if(BFSSearch('b'-97,'m'-97)) cout<<"Yes."<<endl; else cout<<"No."<<endl; memset(matrix,false,sizeof(matrix)); memset(visited,false,sizeof(visited)); memset(inGraph,false,sizeof(inGraph)); } } return 0; }