【机试练习】【C++】【PAT A1053】Path of Equal Weight(玄学一样的“段错误”)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Xiblade/article/details/83187923

此题有较大的玄学,如果将cmp函数的默认返回值更改为true,则会出现最后一个测试用例的“段错误”。
在代码中以“我的天!!!玄学”标识出

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

struct Node{
	int weight;
	vector<int> child;
};
Node t[1010];
vector<vector<int> > serialStore;
vector<int> tmpSerial;
bool cmp(vector<int> a, vector<int> b){
	if(a.empty() || b.empty()){
		return a.empty();
	}
	int minL = min(a.size(), b.size());
	for(int i = 0; i < minL; i++){
		if(a[i] != b[i]) return a[i] > b[i]; // 关键在这里的大于号 
	}
	return false; // 我的天!!玄学 
} 

// 测试cmp是否工作的函数
void sortSerial(){
	vector<int> tmp;
	tmp.push_back(10);tmp.push_back(3);tmp.push_back(3);tmp.push_back(6);tmp.push_back(2);
	serialStore.push_back(tmp);
	tmp.clear();
	tmp.push_back(10);tmp.push_back(5);tmp.push_back(2);tmp.push_back(7);
	serialStore.push_back(tmp);
	tmp.clear();
	tmp.push_back(10);tmp.push_back(4);tmp.push_back(10);
	serialStore.push_back(tmp);
	tmp.clear();
	tmp.push_back(10);tmp.push_back(3);tmp.push_back(3);tmp.push_back(6);tmp.push_back(2);
	serialStore.push_back(tmp);
	tmp.clear();
	sort(serialStore.begin(), serialStore.begin() + 4, cmp);
	while(!serialStore.empty()){
		vector<int> v = serialStore.front();
		while(!v.empty()){
			printf("%d ", v.front());
			v.erase(v.begin(), v.begin() + 1);
		} 
		serialStore.erase(serialStore.begin(), serialStore.begin() + 1);
		printf("\n");
	}
}



int N, M, S;
// N: 节点个数, M: 非叶节点个数, S: 给定权值


void printLayer(int num){
	printf("%02d", num); // 不足两位,以0补齐 
}



void preOrder(int root){
//	printLayer(root);
//	printf(" %d %d\n", t[root].weight, nowLayer);
	// 访问节点的逻辑应该就是:将节点的权值加入临时序列存储
	tmpSerial.push_back(t[root].weight); 
	if(!t[root].child.empty()){
		for(int i = 0; i < t[root].child.size(); i++){
			preOrder(t[root].child[i]);		
		}
	} else{ // 叶子节点的逻辑 
		// 到达叶子节点之后 先计算加和
		int sum = 0;
		for(int i = 0; i < tmpSerial.size(); i++){
			sum += tmpSerial[i];
		} 
		if(sum == S){
			serialStore.push_back(tmpSerial);	
		}
	}
	tmpSerial.pop_back(); 
}


int main(){
	scanf("%d %d %d", &N, &M, &S);
	for(int i = 0; i < N; i++){
		scanf("%d", &(t[i].weight));
	}
	int nodeIdx, childNum;
	int tmpWeight;
	while(scanf("%d %d", &nodeIdx, &childNum) != EOF){
		while(childNum --){
			scanf("%d", &tmpWeight);
			t[nodeIdx].child.push_back(tmpWeight);
		}
	}
	// 尝试先根遍历整棵树 
	preOrder(0);
//	sortSerial();	
	if(serialStore.size() > 1)
		sort(serialStore.begin(), serialStore.begin() + serialStore.size(), cmp);
	while(!serialStore.empty()){
		vector<int> v = serialStore.front();
		while(!v.empty()){
			printf("%d", v.front());
			v.erase(v.begin());
			if(!v.empty())
				printf(" ");
		} 
		serialStore.erase(serialStore.begin());
		if(!serialStore.empty())
			printf("\n");
	}
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/Xiblade/article/details/83187923
今日推荐