原码贴在这里先,思路参考了部分题解,总的来说应该不难理解:
#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,头大