广度优先搜索练习之神奇的电梯
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
有一座已知层数为n的高楼,这座高楼的特殊之处在于只能靠电梯去上下楼,所以要去到某一层要非常耽误时间,然而更悲哀的是,这座高楼的电梯是限号的,小鑫最开始的时候在1层,他想去第x层,问题是他最起码要经过多少层(包含第x层)才能到达第x层。
输入
多组输入。
第一行是三个正整数n,m,q。分别代表楼的总层数,给定的m条信息和q次查询。
接下来的m行,每行的第一个整数pos代表这是第pos层的电梯,第二个数代表从这一层可以去的楼层总共有num个,之后的num个数字代表从第pos层代表可以去的楼层。
最后的q行,每行一个整数代表小鑫想去的楼层号码。
1<=m,pos,num<=n<=200
1<=q<=20
第一行是三个正整数n,m,q。分别代表楼的总层数,给定的m条信息和q次查询。
接下来的m行,每行的第一个整数pos代表这是第pos层的电梯,第二个数代表从这一层可以去的楼层总共有num个,之后的num个数字代表从第pos层代表可以去的楼层。
最后的q行,每行一个整数代表小鑫想去的楼层号码。
1<=m,pos,num<=n<=200
1<=q<=20
输出
对于每次询问输出一个整数,占一行。代表如果要去某个楼层最少要经过多少层,如果到不了的话就输出-1。
示例输入
10 4 3 1 2 6 7 3 4 4 6 8 10 5 2 2 3 7 3 10 5 6 4 5 9
示例输出
5 3 -1
提示
弱第一次写博客,如有错误请见谅。
(>﹏<)
简单的BFS(题目上也有说)。
来源
Casithy
示例程序
#include <stdio.h>
#include <string.h>
struct
{
int d,step;
}q[8000];
int a[200][200],v[200];
int bfs(int x,int n,int y)
{
int f=0,top=0,i;
q[top].step=1; //包括第x层的步数已在这里加1
q[top].d=x;
top++;
while(top>f)
{
if(q[f].d==y)
{
return q[f].step;
}
for(i=0;n>i;i++)
{
if(a[q[f].d][i]==1&&v[i]==0)
{
q[top].d=i;
q[top].step=q[f].step+1; //这里记录步数(至于为什么是加1,而不是加楼层的相对位置就不太清楚了)
v[i]=1; //到过的楼层以后不需要再遍历
top++;
}
}
f++;
}
return -1;
}
int main()
{
int n,q,m,num,pos,i,i1,x;
while(scanf("%d %d %d",&n,&m,&q)!=EOF)
{
memset(a,0,sizeof(a));
for(i=1;m>=i;i++)
{
scanf("%d",&pos);
scanf("%d",&num);
for(i1=1;num>=i1;i1++)
{
scanf("%d",&x);
a[pos-1][x-1]=1; //两层楼是否连通
a[pos-1][pos-1]=1;
}
}
for(i=1;q>=i;i++)
{
memset(v,0,sizeof(v)); //每次询问都是独立的,即从1楼开始
scanf("%d",&pos);
printf("%d\n",bfs(0,n,pos-1));
}
}
return 0;
}
/**************************************
Problem id : SDUT OJ 3468
Code Len : 1195B
Result : Accepted
Take Memory : 452K
Take Time : 20MS
Submit Time : 2016-06-17 20:39:32
**************************************/