题意:是中文。。就不说了。。
算法:
比赛的时候 我用dfs但是没有标记用过的,结果爆栈5次(好像有那么多次。。。)
一直以为RE一般就是指针非法访问内存,除了0什么的,数组开的太大或者太小。
没想到DFS不标记就会无限递归导致爆栈。
我还是太年轻了。。。
#include<cstdio> #include<iostream> #include<cstring> #include<string> #include<queue> #include<stack> #include<algorithm> #include<vector> #include<map> #include<cmath> #include<cctype> using namespace std; char str[102]; vector<int> bv; char s[10010],e[10010]; bool vis[10010]; int cnt; bool dfs(int pos) { vis[pos]=true; //用过的就标记 if(e[pos]==‘m‘) { return true; } for(int i=0;i<cnt;i++) { if(s[i]==e[pos]) { if(vis[i]) continue; //注意判断有没有标记 if(dfs(i)) return true; } } return false; } int main() { int flag=0; cnt=0; while(!bv.empty()) bv.clear(); memset(vis,0,sizeof(vis)); while(scanf("%s",str)!=EOF) { if(str[0]==‘0‘) flag=1; else { s[cnt]=str[0]; if(s[cnt]==‘b‘) bv.push_back(cnt); int len=strlen(str); e[cnt++]=str[len-1]; } if(!flag) continue; int size1 =bv.size(); if(size1==0) puts("No."); else { int tag=0; for(int i=0;i<size1;i++) { if(dfs(bv[i])) { tag=1; break; } } if(tag) puts("Yes."); else puts("No."); } flag=0; cnt=0; memset(vis,0,sizeof(vis)); while(!bv.empty()) bv.clear(); } return 0; }
hdu 1181 变形课 (dfs- -),布布扣,bubuko.com
原文:http://blog.csdn.net/u012841845/article/details/20355743