题目描述

小明在一个地下停车场入口,停车场有若干个路口,每个路口号码为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;
}