HDU 1181 变形课 DFS基础题 初学者角度+详细注释

        题意:单词接龙,起点字母是b,终点字母是m。难得的中文题目啊!
        思路:单词首尾连接一直搜到终点字母,DFS深搜啊,注意格式就行了,wa的基本都是格式。
        悲催啊!本以为这种基础题我应该能一次AC的,谁知道wa了三次在多组输入那个格式那里。这里说一下吧。如果是C语言标准输入输出的话,看到题目有:测试样例有多组。这几个字眼就请乖乖写一句while(scanf( )!=EOF)。 EOF即end of file是结束符,系统默认-1。意思是只要系统从缓冲区读取不到东西的时候才退出程序(我记得是这样吧,哈哈!),如果是C++的话,直接把cin放进while里面就好了,不需要EOF(我初学者,我也不知道为什么,见笑了)。
        下面是我的AC代码(wa在格式上很痛苦)大哭大哭大哭,带详细注释。
题目传送门(喜欢蓝色怪我咯)



#include <iostream>
#include <cstring>
using namespace std;

int i,flag;                         //flag表示是否找到解
char str[1000][20];                 //存单词
bool book[1000];

bool dfs(int j)                     //传入下标
{
    char *p;                        //这里我用指针找到单词的最后一个字母
    p=&str[j][0];
    while(*p!='\0') p++;
    p--;
    if(*p=='m')                     //如果找到字母m就标记flag然后返回
    {
        flag=1;
        return true;
    }
    for(int k=0; k<i; k++)
    {
        if(book[k])                 //标记过的跳过
            continue;
        if(str[k][0]!=*p)           //首字母和上一个单词的尾字母不能连接的跳过
            continue;
        book[k]=true;
        if(dfs(k))                  //如果dfs的下一步是true,就返回true
            return true;
        book[k]=false;
    }
    return false;                   //如果找不到解就返回false
}

int main()
{
    while(cin >> str[i])            //我是wa了三次在这里的输入格式上的问题,注意题目字眼:测试数据有多组
    {                               //如果是C语言的话就要写scanf(" ")!=EOF,表示不遇到结束符就不结束程序
        if(str[i][0]=='0')
        {
            cout << "No." << endl;
            i=0;                    //由于是多组输入,所以结束一次测试后,这里要把i归零
            continue;
        }
        i++;
        while(cin >> str[i])
        {
            if(str[i][0]=='0')
                break;
            i++;
        }

        flag=0;
        int j;

        for(j=0; j<i; j++)                //因为现在的str[i]='0',所以遍历只需要到i-1;
            if(str[j][0]=='b')            //从首字母是'b'的字符串开始dfs
            {
                memset(book,false,sizeof(book));   //这里很重要啊,清零标记数组,dfs常用,有了这个就能节省很多语句
                book[j]=true;
                dfs(j);
            }

        if(flag)
            cout << "Yes." << endl;           //注意有个句号
        else
            cout << "No." << endl;
        i=0;                                  //由于是多组输入,所以这里要把i归零,和上面同理
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值