题目描述
小明在一个地下停车场入口,停车场有若干个路口,每个路口号码为1~n。每个路口有3个方向,左,前,右。小明在入口,即第一个路口,他要去的路口的号码是m。
小明沿着路口的指示牌,能走到他要去路口吗?
输入
多组数据,每组数据n+2行。第一行为一个正整数n代表路口的个数,之后n行,这n行中的第i行为第i个路口的向左路口、向前路口、向右路口(0表示无路)。最后一行为一个正整数m代表出口路口编号。当n=0时输入结束。
测试数据说明:
0 2 0
3 5 6
0 0 4
0 0 0
0 0 0
7 0 0
7
第1行是第1个路口 ,向左无路。向前 到 第2个路口
第2行,第2个路口, 向左到第3个路口, 向前到5 , 向右 到 6
第6行: 7 0 0 表示: 第6个路口向左到 7, 而终点为7, 可以到
输出
每组数据输出一行,若能走到指定的路口,输出“YES”,否则输出“NO”。
样例输入 Copy
6
0 2 0
3 5 6
0 0 4
0 0 0
0 0 0
7 0 0
7
3
2 0 0
0 0 0
0 0 0
3
0
样例输出 Copy
YES
NO
代码实现
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
typedef long long LL;
const LL maxx=1e5+5;
int vis[maxx];
int a[maxx][4];
int n=0,endv=0;
int flag=0;
void dfs(int val){
if(val == endv) { //出口
flag = 1;
return ;
}
for(int i=1;i<=3;i++){ //遍历列(1-3)
int next=a[val][i]; //保存一下当前的value,也就是下一个可以去的路口,即:第next行.
if(next && !vis[next]){
vis[next]=1;
dfs(next);
vis[next]=0; //恢复现场
}
}
}
int main(){
while(cin>>n &&n!=0) {
//初始化
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++) {
for(int j=1;j<=3;j++){
cin>>a[i][j];
}
}
cin>>endv;
flag=0;
vis[1]=1;
dfs(1); //从第一行开始搜
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}