博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hdu 1181 变形课
阅读量:5051 次
发布时间:2019-06-12

本文共 2715 字,大约阅读时间需要 9 分钟。

Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1181

 

看完这题首先想到的是用DFS,因为只要找到就行了,不求找到的最快方法。首先从开头字母为'b'的单词出发,目标为首尾相接,且末字母为'm'的单词。中间的搜索时的下一个链接单位自然是首尾相接的单词。

 

DFS:

#include 
#include
#include
#include
using namespace std;const int maxn = 1000 + 24;string word[maxn];bool vis[maxn];int pos;int flag=0;void dfs( string str ){ if( flag ) return ; int i; for( i=0;i<=pos;i++ ) if( !vis[i] ) { if( word[i][0] == str[ str.length()-1 ] && word[i][ word[i].length()-1 ]=='m' ) //满足首尾相连又已'm'结尾 flag=1; else if( word[i][0]==str[ str.length()-1 ] ) //满足首尾相连的情况 { vis[i]=true; dfs( word[i] ); vis[i]=false; } }}int main(){ pos=0; int i,j; memset( vis,false,sizeof(vis) ); while( cin>>word[pos] ) { if( word[pos][0]=='0' ) //以输入'0'为结尾 { flag=0; for( i=0;i<=pos;i++ ) { if( word[i][0]=='b' ) { vis[i]=true; dfs( word[i] ); vis[i]=false; } } if( flag ) cout<<"Yes.\n"; else cout<<"No.\n"; pos=0; memset( vis,false,sizeof(vis) ); //重新初始化 } else pos++; //没有结尾就一直输入下一个 } return 0;}

 

但当我AC后,稍微一思考,发现可以优化。因为我不需要关注你输入的单词的每一个字母,我所要知道的仅仅为每个输入单词的首字母与末字母。那么我可以建一个链接矩阵,表示两个字母间的链接关系。当然这个连接是单向的,比如输入big,'b'可以指向'g',而不是'g'指向'b'。

 

此处用了BFS:

#include 
#include
#include
#include
#include
using namespace std;const int maxn = 30;bool word[maxn][maxn]; //链接矩阵bool vis[maxn][maxn]; //是否已访问bool bfs(){ const int start = 'b'-'a'; const int finish = 'm'-'a'; queue
qt; qt.push( start ); //从'b'出发 int t, i; while( !qt.empty() ) { t = qt.front(); qt.pop(); if( word[t][finish] ) //找到末尾是'm'的单词 return true; for( i=0;i<='z'-'a';i++ ) if( !vis[t][i] && word[t][i] ) //寻找未访问的首尾组合 { vis[t][i] = true; qt.push(i); } } return false;}int main(){ string temp; memset( vis, false, sizeof(vis) ); memset( word, false, sizeof(word) ); while( cin>>temp ) { if( temp[0]=='0' ) //一组输入完毕 { if( bfs() ) cout<<"Yes.\n"; else cout<<"No.\n"; memset( vis, false, sizeof(vis) ); memset( word, false, sizeof(word) ); } else word[ temp[0]-'a' ][ temp[ temp.length()-1 ]-'a' ] = true; } return 0;}

 

除了BFS,DFS,还可以用最短路径,判断起点'b'能否到'm'即可,这里就不贴代码了。网上也还有很多的其他解法。

总之,这道题不难,但对扩展思路还是有一定帮助的。

转载于:https://www.cnblogs.com/Emerald/p/3984808.html

你可能感兴趣的文章
mysql事务
查看>>
[最大环+缩点+BFS]codeforces Round 95 Div2
查看>>
asp.net 获取服务器及客户端的相关信息
查看>>
Python基础01
查看>>
Bit,Byte,WORD,DWORD区别和联系
查看>>
英语中咖啡表示
查看>>
kali更新源
查看>>
The Settlers of Catan
查看>>
Android:JNI与NDK(一)
查看>>
使用BBCP来提升跨互联网的数据传输速度
查看>>
08 Python - Python数值类型
查看>>
34 Python - 正则表达式 Group编组
查看>>
LeetCode: Validate Binary Search Tree
查看>>
160303、js加密跟后台加密对应
查看>>
026_nginx引用lua遇到的坑
查看>>
找出给定字符串中出现最多的字符和次数
查看>>
IPTV中的EPG前端优化
查看>>
C 字符串操作函数
查看>>
Makefile文件的使用
查看>>
接口测试工具-Jmeter使用笔记(一:运行一个HTTP请求)
查看>>