Problem Description
有一座已知层数为n的高楼,这座高楼的特殊之处在于只能靠电梯去上下楼,所以要去到某一层要非常耽误时间,然而更悲哀的是,这座高楼的电梯是限号的,小鑫最开始的时候在1层,他想去第x层,问题是他最起码要经过多少层(包含第x层)才能到达第x层。
Input
多组输入。
第一行是三个正整数n,m,q。分别代表楼的总层数,给定的m条信息和q次查询。
接下来的m行,每行的第一个整数pos代表这是第pos层的电梯,第二个数代表从这一层可以去的楼层总共有num个,之后的num个数字代表从第pos层代表可以去的楼层。
最后的q行,每行一个整数代表小鑫想去的楼层号码。
1<=m,pos,num<=n<=200
1<=q<=20
Output
对于每次询问输出一个整数,占一行。代表如果要去某个楼层最少要经过多少层,如果到不了的话就输出-1。
Sample Input
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
Sample Output
5 3 -1
#include <bits/stdc++.h>
using namespace std;
int a[210][210];
int visit[210];
struct node
{
int step,aim;
}x,z;
void bfs(int t,int n)//t为询问,n为总层数
{
visit[1]=1;
queue<node> q;
x.aim=1;
x.step=1;
q.push(x);
while(!q.empty()){
x=q.front();
q.pop();
//每次先进行判断
if(x.aim==t){
cout<<x.step<<endl;
return;
}
for(int i=1;i<=n;i++){
if(!visit[i]&&a[x.aim][i]){
visit[i]=1;
z.aim=i;
z.step=x.step+1;
q.push(z);
}
}
}
cout<<"-1"<<endl;
}
int main()
{
int n,m,q;
while(cin>>n>>m>>q){
memset(a,0,sizeof(a));
int pos,num,x;
while(m--){
cin>>pos>>num;
while(num--){
cin>>x;
a[pos][x]=1;
}
}
int ask;
while(q--){
memset(visit,0,sizeof(visit));
cin>>ask;
bfs(ask,n);
}
}
return 0;
}