本文主要是介绍HDOJ 1181 变形课(邻接表+DFS或BFS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
http://acm.hdu.edu.cn/showproblem.php?pid=1181
变形课
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 16232 Accepted Submission(s): 5836
Harry已经将他所会的所有咒语都列成了一个表,他想让你帮忙计算一下他是否能完成老师的作业,将一个B(ball)变成一个M(Mouse),你知道,如果他自己不能完成的话,他就只好向Hermione请教,并且被迫听一大堆好好学习的道理.
so soon river goes them got moon begin big 0
Yes.Harry 可以念这个咒语:"big-got-them".HintHint
保存一个单词的首字母和尾字母,把字母对应1~26数字,建立邻接表;然后从数字为2(也就是对应的字母‘b')的表头开始搜索,直到搜到数字13(也就是对应字母'm'),或者搜不到。开始用DFS溢栈,用BFS超时,原因是没有对已经搜过的点标记,下次就不用搜了,标记以后就AC了。
BFS搜索
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define fun(c) (c-'a'+1)
#include<queue>
#include<algorithm>
using namespace std;
struct Node
{int n;struct Node *next;
} *p;
struct Word
{int n;bool J;//标记已经搜索过 struct Node *next;
}num[27];
bool judge;
//-----邻接表的深度优先搜索-----//
//void DFS(struct Node *s) //栈溢出
//{
// if(judge) return;
// while(s)
// {
// if(s->n==fun('m'))
// judge=true;
// DFS(num[s->n].next);
// s=s->next;
// }
//}
//------------------------------////-----邻接表的广度优先搜索-----//
void BFS(struct Node *s)
{queue<int>Q;int n;for(;s;s=s->next)Q.push(s->n);while(!Q.empty()){n=Q.front();Q.pop();num[n].J=true;for(s=num[n].next;s;s=s->next){if(!num[s->n].J)Q.push(s->n);if(s->n==fun('m')){judge=true;return;}}}
}
//------------------------------//
int main()
{char s[100];int n,i,k=0,a,b;struct BEC//存放首位字母 {char c1,c2;}C[1000];while(~scanf("%s",s)){if(strlen(s)==1&&s[0]=='0'){for(i=1;i<=26;i++){//邻接表 表头初始化 num[i].n=i;num[i].J=false;num[i].next=NULL;}for(i=0;i<k;i++){//建立邻接表 a=fun(C[i].c1);//将字母对应成数字a~z对应1~26 b=fun(C[i].c2);p=(struct Node *)malloc(sizeof(struct Node));p->n=b;p->next=num[a].next;num[a].next=p; }judge=false;num[fun('b')].J=true;//DFS(num[fun('b')].next);//从表头数字为5开始,DFS查找是否有fun(m)。//搜索过的要标记,否则栈溢出BFS(num[fun('b')].next);//BFS搜索 要将搜索过的标记,否则会超时 k=0;if(judge)printf("Yes.\n");elseprintf("No.\n");continue;}n=strlen(s);C[k].c1=s[0];C[k].c2=s[n-1];k+=1;}return 0;
}
DFS搜索
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define fun(c) (c-'a'+1)
#include<queue>
#include<algorithm>
using namespace std;
struct Node
{int n;struct Node *next;
} *p;
struct Word
{int n;bool J;//标记已经搜索过 struct Node *next;
}num[27];
bool judge;
//-----邻接表的深度优先搜索-----//
void DFS(struct Node *s) //栈溢出
{if(judge) return;while(s){if(s->n==fun('m'))judge=true;if(!num[s->n].J){num[s->n].J=true;DFS(num[s->n].next);}s=s->next;}
}
//------------------------------////-----邻接表的广度优先搜索-----//
//void BFS(struct Node *s)
//{
// queue<int>Q;
// int n;
// for(;s;s=s->next)
// Q.push(s->n);
// while(!Q.empty())
// {
// n=Q.front();
// Q.pop();
// num[n].J=true;
// for(s=num[n].next;s;s=s->next)
// {
// if(!num[s->n].J)
// Q.push(s->n);
// if(s->n==fun('m'))
// {
// judge=true;
// return;
// }
// }
// }
//}
//------------------------------//
int main()
{char s[100];int n,i,k=0,a,b;struct BEC//存放首位字母 {char c1,c2;}C[1000];while(~scanf("%s",s)){if(strlen(s)==1&&s[0]=='0'){for(i=1;i<=26;i++){//邻接表 表头初始化 num[i].n=i;num[i].J=false;num[i].next=NULL;}for(i=0;i<k;i++){//建立邻接表 a=fun(C[i].c1);//将字母对应成数字a~z对应1~26 b=fun(C[i].c2);p=(struct Node *)malloc(sizeof(struct Node));p->n=b;p->next=num[a].next;num[a].next=p; }judge=false;num[fun('b')].J=true;DFS(num[fun('b')].next);//从表头数字为5开始,DFS查找是否有fun(m)。//搜索过的要标记,否则栈溢出//BFS(num[fun('b')].next);//BFS搜索 要将搜索过的标记,否则会超时 k=0;if(judge)printf("Yes.\n");elseprintf("No.\n");continue;}n=strlen(s);C[k].c1=s[0];C[k].c2=s[n-1];k+=1;}return 0;
}
这篇关于HDOJ 1181 变形课(邻接表+DFS或BFS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!