字符串的dfs

因为没有回溯和vis记录,导致栈的超出
所以,dfs中记得vis标记和回溯,可以达到剪枝的效果

传送门
用结构体只存储单词的首位和末尾
然后如果在搜索中首位等于某位就不进行该情况的搜索,如果有匹配的,就搜索,和迷宫一样

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=10005;
bool flag=false;
bool vis[naxn];
int cnt=0;
struct node{
    char first;
    char endw;
}word[maxn];
void print(){
    printf("%s.\n",flag==true?"Yes":"No");
}
void dfs(node a,int pos){
    //printf("%c %c\n",a.first,a.endw);
    if(flag)return;
    if(a.endw=='m'){
        flag=true;
        return;
    }
    while(int i=0;i<cnt;i++){
        if(vis[i])continue;
        if(word[x].first==a.endw){
            if(word[x].first==word[x].endw||x==pos){
                //如果说这个字母首位相同或者搜回到自己
            }else {
                vis[x]=true;
                dfs(word[x],x);
                vis[x]=false;
            }
        }
    }

}
bool cmp(node a,node b){
    if(a.first==b.first)return a.endw<b.endw;
    return a.first<b.first;
}
void init(){
    cnt=0;
    flag=false;
}
int main(){
    char s[105];
    while(~scanf("%s",s)){

        if(s[0]=='0'){
            sort(word,word+cnt,cmp);
            for(int i=0;i<cnt;i++){
                //printf("%c %c\n",word[i].first,word[i].endw);
               if(word[i].first=='b'&&flag==false){
                   dfs(word[i],i);
               }else{
                   break;
               }
            }
            print();
            init();
        }else{
            int len=strlen(s);
            word[cnt].first=s[0],word[cnt++].endw=s[len-1];
        }

    }
    return 0;
}
posted @ 2019-10-09 21:18  Emcikem  阅读(190)  评论(0编辑  收藏  举报