ACM1004:公交车路线问题

这道题目中,输入的第一行包含一个整数T(0 <T< 30),这是测试用例的数量。对于每个测试用例,第一个包含两个不同的数字,表示Bo要求的起始站和结束站。Xi说,第二行是公交车路线的数量n(0 <n<= 50)。对于以下n行中的每一行,第一个数字m(2 <= m<= 100)代表公交车路线上的公交车站数量。剩下的m数字代表m公交车站。所有的公交车站都有一个数字,介于0到100之间。所以你可以认为长沙只有100个公交车站。

要求对于每个测试用例,Yes如果Bo可以通过使用Xi告诉的一些总线从起始站到达终点站,则输出“ ”。否则输出“ No”。

分析:

在这题中,在理解完题目之后,我们开始寻找入手点。首先我们需要输入一个测试案例数量的变量,我们定义为number,在在主函数中循环number次playBus(该函数为主要计算是否有公交车路线的代码)。

然后我们开始playBus的代码,首先我们需要声明一些变量,始发站(begin)、终点站(end)、路线数量、路线站点数、站点名字。我们用一个二维数组记录该次测试所需要的所有路线以及他们的站点数和站点名字。这个二维数组的行数为你所输入的路线数量,列数位你的该行的第一列的数字大小。

接着我们开始对这个数组进行赋值,用两个for循环将输入的数据赋值给这个二维数组。

在这里我们继续分析这道题,如果在你的所有路线中,有那么一条是可以使答案为yes的,那么这一条线路将会含有begin和end的。

我们在这里就添加一个static的数组,这个数组就将是你的线路图(你能够从begin开始所到达的所有站点),如果这个数组能够从begin开始到end结束,那么将会是yes。

那么,我们从begin开始,我们将二维数组遍历第一次(遍历的时候不能遍历第一列的数据,因为他们不是站点名),寻找是否有与begin相同的数据,如果没有,那么可以直接为no了,如果有,我们将与begin数据相同的那一排的数据添加进你的static数组中。

接下来,我们需要对你新加进来的站点名进行线路扩充了,如果其他的线路里面含有了你刚刚添加进来的站点,那么那些线路的站点你也能够全部到达。

现在我们开始第二次遍历 了,与上一次的不同,我们首先将static里面的数据进行遍历,每一次循环中定义一个new_begin,作为你这次所需要寻找的站点。依此类推,我们不断的添加新站点,再将新站点作为新的开始,这样我们就可以在static中,添加进我们所有能够从始发站到达的目的地了。

最后就是判断了,我们只要在static中找到了end,就说明可以到达,值为yes,反之为no。

以下是全部代码(欢迎各位朋友点评,若有不足之处或可以优化之处可以指出来)

#include <iostream>
using namespace std ;
void judge(int count){
	if(count == 0){
		cout<<"No"<<endl;
	}
	else{
		cout<<"Yes"<<endl;
	}
}
int putInto(int x, int a[], int length){
	for(int i = 0; i < length; i++){
		if(x == a[i]){
			return -1;
		}
		else if(a[i] == -1){
			return x;
		}
	}
}
int getLength(int a[], int length){
	for(int i = 0; i < length; i++){
		if(a[i] == -1){
			return i;
		}
	}
}
void playBus(){
	int Begin, End;
	cin>>Begin>>End;
	int num;
	cin>>num;
	int s[num][100];
	int station[100];
	int count = 0;
	for(int i =0; i <100; i++){
		station[i] = -1;
	}
	for(int i = 0; i < num; i++){
		cin>>s[i][0];
		for(int j = 1; j <= s[i][0]; j++){
			cin>>s[i][j];
		}	
	}
	for(int i = 0;i<num;i++){
		for(int j = 1;j<=s[i][0];j++){
			if(s[i][j] == Begin){
				station[0] = Begin; 
				for(int k = 1; k <= s[i][0]; k++){
					int newMember = putInto(s[i][k], station, 100);
					station[getLength(station, 100)] = newMember;
				}
			}
		}
	}
	for(int c = 0; c < 100; c++){
		int newBegin = station[c];
		for(int i = 0;i<num;i++){
			for(int j = 1;j<=s[i][0];j++){
				if(s[i][j] == newBegin){
					for(int k = 1; k <= s[i][0]; k++){
						int newMember = putInto(s[i][k], station, 100);
						station[getLength(station, 100)] = newMember;
					}
				}
			}
		}
	}
	for(int i =0; i < 100; i++){
		if(station[i] == End){
			count = 1;
		}
	}
	judge(count);
}
int main(){
    int number;
    cin>> number;
	for( number; number>0; number--){
		playBus();
	} 
}

猜你喜欢

转载自blog.csdn.net/qq_41681675/article/details/81176287