题解 | 坠落的蚂蚁

坠落的蚂蚁

https://www.nowcoder.com/practice/fdd6698014c340178a8b1f28ea5fadf8

硬模拟,不知为何就是有一个用例没通过 19/20

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<vector>
#include<list>
using namespace std;

struct ant {
	int pos;
	int dir;
	bool visit;
};

struct record {
	int count;
	vector<int> arrindex;
};

int main() {
	int N,index=-1;
	vector<ant> arr;
	scanf("%d",&N);
	for (int i = 0; i < N; i++) {
		int a,  b;
		scanf(" %d%d",&a,&b);
		arr.push_back({a,b,0});
		if(b==0)
			index=i;			
	}
	int t=0;
	record rec[101];
	for (int i = 0; i <= 100; i++) {
		rec[i].count = 0;
		rec[i].arrindex.clear();
	}
	for (int i = 0; i < N; i++) {
		rec[arr[i].pos].count++;
		rec[arr[i].pos].arrindex.push_back(i);
	}

	while (1) {
 		if(arr[index].pos==0||arr[index].pos==100) //fall
			break;
		//precheck
		for (int i = 0; i < N; i++)
		{
			arr[i].visit=false;
		}
		for (int i = 1; i < 100; i++) {
			if (rec[i + 1].count >= 1 && rec[i].count  >= 1) {
				//rec[i + 1].arrindex[0]
				int jv=-1, kv=-1;
				for (int j = 0; j < rec[i + 1].arrindex.size(); j++) {
					if (arr[rec[i + 1].arrindex[j]].dir == -1) {
						jv=j;
						break;
					}
						
				}for (int k = 0; k < rec[i].arrindex.size(); k++) {
					if (arr[rec[i].arrindex[k]].dir == 1) {
						kv=k;
						break;
					}
				}
				if (kv >= 0 && jv >= 0 && kv < rec[i].arrindex.size() && jv < rec[i + 1].arrindex.size() && arr[rec[i + 1].arrindex[jv]].visit==false && arr[rec[i].arrindex[kv]].visit==false) {
					swap(arr[rec[i + 1].arrindex[jv]].dir, arr[rec[i].arrindex[kv]].dir);
					swap(arr[rec[i + 1].arrindex[jv]].pos, arr[rec[i].arrindex[kv]].pos);
					arr[rec[i + 1].arrindex[jv]].visit=true;
					arr[rec[i].arrindex[kv]].visit = true;
				}
			}
		}
		for (int i = 0; i <= 100; i++) {
			rec[i].count = 0;
			rec[i].arrindex.clear();
		}
		t++; //start moving
		for (int i = 0; i < N; i++) {
			if (arr[i].dir == 1 && arr[i].pos!=0 && arr[i].pos != 100) {
				++arr[i].pos;
				rec[arr[i].pos].count++;
				rec[arr[i].pos].arrindex.push_back(i);
			}	
			else if(arr[i].dir==-1 && arr[i].pos != 0 && arr[i].pos != 100){
				--arr[i].pos;
				rec[arr[i].pos].count++;
				rec[arr[i].pos].arrindex.push_back(i);
			}
			else if (arr[i].dir == 0 && arr[i].pos != 0 && arr[i].pos != 100) {
				rec[arr[i].pos].count++;
				rec[arr[i].pos].arrindex.push_back(i);
			}
		}
		//check
		int remain=0;
		for(int i=1;i<100;i++){
			if (rec[i].count == 2) {
				swap(arr[rec[i].arrindex[0]].dir,arr[ rec[i].arrindex[1]].dir);
			}
			else if (rec[i].count == 3) {
				for (int j = 0; j < 3; j++) {
					if (arr[rec[i].arrindex[j]].dir == 0) {
						vector<int>::iterator it = rec[i].arrindex.begin() + j;
						rec[i].arrindex.erase(it);
						swap(arr[rec[i].arrindex[0]].dir, arr[rec[i].arrindex[1]].dir);
					}
				}
			}
			//if (rec[i + 1].count == 1 && rec[i].count == 1) {
			//	//rec[i + 1].arrindex[0]
			//	if (arr[rec[i + 1].arrindex[0]].dir == -1 && arr[rec[i].arrindex[0]].dir == 1) {
			//		swap(arr[rec[i+1].arrindex[0]].dir, arr[rec[i].arrindex[0]].dir);
			//		swap(arr[rec[i + 1].arrindex[0]].pos, arr[rec[i].arrindex[0]].pos);
			//	}	
			//}
		}
		int other=0;
		for (int i = 1; i < 100; i++) {
			if(rec[i].count == 1)
				remain++;
			if(rec[i].count != 0)
				other++;
		}
		if (remain == 1 && other==1 && arr[index].pos > 0 && arr[index].pos < 100) {
			printf("Cannot fall!\n");
			return 0;
		}
	}	
	printf("%d\n",t);
	return 0;
}

全部评论

相关推荐

01-23 19:11
已编辑
门头沟学院 前端工程师
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务