变形课-哈利波特的练习

呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规律:如果咒语是以a开头b结尾的一个单词,那么它的作用就恰好是使A物体变成B物体. 
Harry已经将他所会的所有咒语都列成了一个表,他想让你帮忙计算一下他是否能完成老师的作业,将一个B(ball)变成一个M(Mouse),你知道,如果他自己不能完成的话,他就只好向Hermione请教,并且被迫听一大堆好好学习的道理.
 

Input

测试数据有多组。每组有多行,每行一个单词,仅包括小写字母,是Harry所会的所有咒语.数字0表示一组输入结束.
 

Output

如果Harry可以完成他的作业,就输出"Yes.",否则就输出"No."(不要忽略了句号)
 

Sample Input

so soon river goes them got moon begin big 0
 

Sample Output

Yes.
 
 
解题思路:定义一个二维数组map,将每次输入的单词的第一个和最后一个字母存到map中,因为没必要把整个单词都存下来,这样可以节约内存,然后定义一个一位数组,用来记录单词是否已经被访问过,防止重复访问,再初始化一个队列,将开头为b的单词先存到map中,若无以b开头的单词,直接返回 0 ,若有以b开头的单词,则用一个bfs,即可;
AC代码:

#include<string.h>
#include<stdlib.h>
#include<stdio.h>

typedef struct node
{
char herry[25];
struct node *next;
}*Linklist ,LNode;
typedef struct
{
Linklist front ,rear;
}Queue;
char map[1000][3];
int visit[1000];

void push(Queue *Q,char *str)
{
Linklist p;
p =(Linklist )malloc(sizeof(LNode));
strcpy(p->herry,str);
p->next=NULL;
if(Q->front == NULL)
{
Q->front = p ;
Q->rear = p ;
return ;
}
Q->rear->next=p;
Q->rear=p;
}

int bfs(Queue *Q,int n)
{
while(Q->front != NULL )
{
char x=Q->front->herry[1];
if(x=='m')
return 1;
for(int i=0;i<n&&map[i][0]!='\0';i++)
if(map[i][0]==x&&visit[i]!=1)
{
push(Q,map[i]);
// printf("%s\n",map[i]);
visit[i]=1;
}
Q->front=Q->front->next;
}
return 0;
}

int main()
{
char str[50];
while( scanf("%s" , str ) != EOF)
{
getchar();
int i=0;
while(str[0]!='0')
{
// scanf("%s",str);
// if(str[0]=='0')
// break;
int l=strlen(str);
map[i][0]=str[0];
map[i][1]=str[l-1];
map[i][2]='\0';
i++;
scanf("%s",str);
getchar();
}
Queue *Q;
Q = new Queue;
Q->front=Q->rear=NULL;

memset(visit ,0,sizeof(visit));
for(int j=0;j<i;j++)
if(map[j][0]=='b')
{
push(Q,map[j]);
visit[j]=1;
}
int ans=bfs(Q,i);
if(ans)
printf("Yes.\n");
else
printf("No.\n");
}
return 0;
}

posted @ 2013-03-17 21:48  xiaxiaosheng  阅读(938)  评论(0)    收藏  举报