在怪地方爆了RE11,求奆佬指点
查看原帖
在怪地方爆了RE11,求奆佬指点
517527
shrayy楼主2023/10/5 22:42

原码贴在这里先,思路参考了部分题解,总的来说应该不难理解:

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

int map[12][12];
int status[160010];
//               N  E  S  W
int faceX[4] = { 0, 1, 0, -1 };
int faceY[4] = { -1, 0, 1, 0 };

struct unit
{
	int x, y, dir;

	void move() {
		if (map[x + faceX[dir]][y + faceY[dir]] != 1)
			dir = (dir + 1) % 4;
		else{
			x += faceX[dir];
			y += faceY[dir];
		}
	}
};

int Eigen(unit f, unit c) {
	return (f.x-1) + (f.y-1) * 10 + (c.x-1) * 100 + (c.y-1) * 1000 + f.dir * 10000 + c.dir * 40000 - 1111;
}

int main() {

	int i, j, time = 0;
	char line[11];
	unit farmer{ 0,0,0 }, cows{0,0,0};

	memset(map, 0, sizeof(map));

	for (i = 1; i <= 10; i++)
	{
		cin >> line;
		for (j = 1; j <= 10; j++)
		{
			switch (line[j - 1])
			{
				case '.':
					map[j][i] = 1;
					break;
				case '*':
					map[j][i] = 0;
					break;
				case 'F':
					map[j][i] = 1;
					farmer.x = j;
					farmer.y = i;
					farmer.dir = 0;
					break;
				case 'C':
					map[j][i] = 1;
					cows.x = j;
					cows.y = i;
					cows.dir = 0;
					break;
			}
		}
	}
	
	for (i = 0; i < 12; i++)
	{
		for (j = 0; j < 12; j++)
		{
			switch (map[j][i])
			{
			case 0:
				cout << "*";
				break;
			case 1:
				cout << ".";
				break;
			default:
				cout << "?";
			}
		}
		cout << endl;
	}
	
	do {
		
		cout << "step:" << time << endl;
		cout << "farmer:\t";
		cout << "X:" << farmer.x << "\t";
		cout << "Y:" << farmer.y << "\t";
		cout << "D:" << farmer.dir << endl;

		cout << "cows:\t";
		cout << "X:" << cows.x << "\t";
		cout << "Y:" << cows.y << "\t";
		cout << "D:" << cows.dir << endl;
		
		if(status[Eigen(farmer, cows)]){
			cout << 0;
			return 0;
		}
		status[Eigen(farmer, cows)] = 1;
		farmer.move();
		cows.move();
		time++;
	} while (farmer.x != cows.x || farmer.y != cows.y);

	cout << time;
	return 0;
}

别的测试点都能过,照理来说应该不会有数组越界,然而就只有#6和#8爆了RE11,头大

2023/10/5 22:42
加载中...