hdu1181 dfs搜索之变形课

原题地址

这道题数据据说比较水,除了第一组数据是Yes以外,其余都是No,很多人抓住这点就水过了。当然了,我觉得那样过了也没什么意思。刷oj刷的是质量不是数量。这道题从题目上来看是个不错的 搜索题,解法多种多样,有 dfs,bfs,并查集,dijkstra算法都能解决。

题目分析:

题目中给了很多字符串,但是关心的只是字符串的第一个和最后一个字符。咋看起来,貌似是要建立一个个字符间的“映射”,其实不然,这其实可以转化为一张26*26的有向图。有最多26个结点,原先的字符间映射关系就转化为结点之间有路径。问题就变成了是否能找一条路径从结点b到结点m。

我用的dfs解的。

#include<iostream>
#include<cstring>
using namespace std;
bool g[26][26];//全局变量声明时会被初始化为0(false)
bool used[26];//全局变量声明时会被初始化为0(false)
bool dfs(int i)
{
    used[1]=true;
    for(int j=0;j<26;j++)
    {
        if(i!=j&&!used[j]&&g[i][j])
        {
            if(i!=1)
                g[1][j]=true;
            used[j]=true;
            dfs(j);
        }
    }
    return g[1][12];//b为1,m为12
}
int main()
{
    char s[100];
    while(cin>>s)
    {
        if(s[0]!='0')
        {
            int len=strlen(s);
            g[s[0]-'a'][s[len-1]-'a']=true;
            continue;
        }
        if(dfs(1))
            cout<<"Yes."<<endl;
        else
            cout<<"No."<<endl;
        memset(g,false,sizeof(g));
        memset(used,false,sizeof(used));
    }
}


转载于:https://www.cnblogs.com/unclejelly/p/4082067.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值