博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【DFS】UVa10129 - Play on Words
阅读量:7090 次
发布时间:2019-06-28

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

题意

给出n个单词,问这n个单词是否可以首尾相连

思路

欧拉道路问题,用dfs解决

把每个单词的首字母和尾字母存到G[][]中,用vis数组记录访问过的次数(因为会有相同的首尾字母,即G[][]>1),用cnt记录道路的长度。

总结

这个题思路比较清晰,两次敲代码折在了同一个地方就是 G[s[0]-'a'][s[len]-'a'],没加s[]直接写的len-'a'_(:з」∠)_看了好久愣是看不出来,ZZ

 

#include 
#include
#include
const int maxn = 1010;int T, n, cnt = 0;int G[30][30], vis[30][30];char s[maxn];using namespace std;void dfs(int u){ cnt++; for(int v = 0; v < 26; v++){ if(G[u][v] && vis[u][v] < G[u][v]){ vis[u][v]++; dfs(v); } }}int main(){ //freopen("in.txt","r",stdin); cin >> T; while(T--){ cin >> n; getchar(); memset(G, 0, sizeof G); memset(vis, 0, sizeof vis); for(int i = 0; i < n; i++){ cin >> s; int len = strlen(s) - 1; G[s[0]-'a'][s[len]-'a']++; } bool flag = false; for(int i = 0; i < 26; i++){ for(int j = 0; j < 26; j++){ if(G[i][j]){ //用每个单词开一次头 cnt = 0; vis[i][j]++; dfs(j); if(cnt == n) {flag = true; break;} memset(vis , 0 ,sizeof vis); //不要忘了数组清零 } } if(flag) break; } if(flag) cout << "Ordering is possible." << endl; else cout << "The door cannot be opened." << endl; } return 0;}

 

转载于:https://www.cnblogs.com/kikii233/p/5961345.html

你可能感兴趣的文章
vuex相关(actions和mutation的异曲同工)
查看>>
解决Maven项目相互依赖/循环依赖/双向依赖的问题
查看>>
UML
查看>>
HTTP 返回码中 301 与 302 的区别
查看>>
App自动化测试探索(二)MAC环境搭建iOS+Python+Appium测试环境
查看>>
使用MATPLOTLIB 制图(散点图,热力图)
查看>>
《深入PHP:面向对象、模式与实践》(一)
查看>>
[06] JavaScript 类型
查看>>
求最大值及其下标
查看>>
关于类型“LinkButton”的控件“xxx”必须放在具有 runat=server 的窗体标记内问题的解决方案...
查看>>
Javascript:DOM表格操作
查看>>
解决WCF传输大数据量时出错并提示:远程主机强迫关闭了一个现有的连接
查看>>
蓝桥杯-波动数列
查看>>
图片理论基础
查看>>
HDU4300 Clairewd’s message
查看>>
07.设计模式_适配器模式
查看>>
Unity Shader入门精要学习笔记 - 第10章 高级纹理
查看>>
2012.02.09(如何在Linux的Qt中,在while中按键退出)
查看>>
web基础
查看>>
VMware Workstation ubuntu 扩容
查看>>