您的位置:首页 > 其它

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

2017-04-26 01:00 288 查看
        题意:单词接龙,起点字母是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: