[HDU] 1181 变形课-简单建模后广搜

 题目链接:

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;
} 

 

posted @ 2013-04-13 17:43  kbyd  阅读(227)  评论(0编辑  收藏  举报