풀이 방법 : 구현? 시뮬레이션?
좌표 정보들이 주어지면, 시작 위치에서부터 각 방향으로 출발하는 경우 4가지를 다 시뮬레이션을 돌려보면 된다. 문제에서 주어진 대로 방향만 변경해주는 것만 신경쓰면 딱히 어려울게 없는 문제였다.
무한히 전파될 수 있다면 "Voyager"를 출력하라고 했다. 무한히 전파되는 경우는 같은 방향으로 이미 지나간 적이 있는 좌표가 있었는지를 보면 검출해낼 수 있다.
문제에서 URDL 순서로 앞서는 것을 출력하라고 했으므로 해당 순서대로 검사해주면 된다.
#include <iostream>
using namespace std;
//U , R, D, L
int DirY[4] = { -1,0,1,0 };
int DirX[4] = { 0,1,0,-1 };
char Map[501][501] = {};
int MaxSec = 0;
int MaxDirIdx = -1;
int main()
{
cin.tie(nullptr);
cout.tie(nullptr);
ios::sync_with_stdio(false);
int N, M;
cin >> N >> M;
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= M; ++j)
cin >> Map[i][j];
}
int StartY, StartX;
cin >> StartY >> StartX;
for (int i = 0; i < 4; ++i)
{
bool Check[501][501][4] = {};
int CurDir = i;
int CurrentY = StartY;
int CurrentX = StartX;
int CurSec = 1;
while (true)
{
++CurSec;
CurrentY += DirY[CurDir];
CurrentX += DirX[CurDir];
if (CurrentY < 1 || CurrentY > N
|| CurrentX < 1 || CurrentX > M)
break;
if (Check[CurrentY][CurrentX][CurDir])
{
switch (i)
{
case 0:
cout << 'U' << '\n';
break;
case 1:
cout << 'R' << '\n';
break;
case 2:
cout << 'D' << '\n';
break;
case 3:
cout << 'L' << '\n';
break;
}
cout << "Voyager";
return 0;
}
Check[CurrentY][CurrentX][CurDir] = true;
if(Map[CurrentY][CurrentX] == 'C')
{
break;
}
else if (Map[CurrentY][CurrentX] == '\\')
{
//
//U , R, D, L
switch (CurDir)
{
case 0:
CurDir = 3;
break;
case 1:
CurDir = 2;
break;
case 2:
CurDir = 1;
break;
case 3:
CurDir = 0;
break;
}
}
else if (Map[CurrentY][CurrentX] == '/')
{
//URDL
switch (CurDir)
{
case 0:
CurDir = 1;
break;
case 1:
CurDir = 0;
break;
case 2:
CurDir = 3;
break;
case 3:
CurDir = 2;
break;
}
}
if (CurSec > MaxSec)
{
MaxSec = CurSec;
MaxDirIdx = i;
}
}
}
switch (MaxDirIdx)
{
case 0:
cout << 'U' << '\n';
break;
case 1:
cout << 'R' << '\n';
break;
case 2:
cout << 'D' << '\n';
break;
case 3:
cout << 'L' << '\n';
break;
}
cout << MaxSec;
}
어우 코드 너무 더럽다.