풀이 방법 : 구현
그냥 문제가 요구하는 대로 따라가면 된다.
여기서 헷갈리지 말아야할 것은 입력을 기준으로 어느쪽이 북쪽인지다.또한 이미 청소를 완료한 좌표라고 하더라도 "이동"은 가능하다는 것을 까먹지 말자.
#include <iostream>
#include <vector>
int Room[51][51] = {};
bool check[51][51] = {};
int DirY[4] = { -1,0,1,0 };
int DirX[4] = { 0,1,0,-1 };
using namespace std;
int main()
{
int N, M;
cin >> N >> M;
int r, c, d;
cin >> r >> c >> d;
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < M; ++j)
{
cin >> Room[i][j];
}
}
int Cnt = 0;
while (true)
{
if (!check[r][c])
{
++Cnt;
check[r][c] = true;
}
bool Enable = false;
for (int i = 0; i < 4; ++i)
{
int NextY = r + DirY[i];
int NextX = c + DirX[i];
if (NextY >= N || NextY < 0 ||
NextX >= M || NextX < 0)
continue;
if (Room[NextY][NextX] == 0)
{
if (!check[NextY][NextX])
{
Enable = true;
break;
}
}
else
continue;
}
if (Enable)
{
d -= 1;
if (d < 0)
d = 3;
int NextY = r + DirY[d];
int NextX = c + DirX[d];
if (NextY >= N || NextY < 0 ||
NextX >= M || NextX < 0)
continue;
if (Room[NextY][NextX] == 0)
{
if (!check[NextY][NextX])
{
r = NextY;
c = NextX;
}
}
}
else
{
int NextY = r - DirY[d];
int NextX = c - DirX[d];
if (NextY >= N || NextY < 0 ||
NextX >= M || NextX < 0)
break;
if (Room[NextY][NextX] == 0)
{
r = NextY;
c = NextX;
}
else
break;
}
}
cout << Cnt;
}