문제 : https://www.acmicpc.net/problem/14503
코드 :
#include <iostream>
using namespace std;
int N, M;
int R, C, D;
int num[50][50] = { 0 };
int clearCount = 0;
std::pair<int,int> SelectDirection(int d)
{
std::pair<int, int> temp;
switch (d)
{
case 0:
temp.first = 0;
temp.second = -1;
break;
case 1:
temp.first = -1;
temp.second = 0;
break;
case 2:
temp.first = 0;
temp.second = 1;
break;
case 3:
temp.first = 1;
temp.second = 0;
break;
}
return temp;
}
//회전
int Rotation(int d)
{
d -= 1;
if (d < 0)
{
d = 3;
}
return d;
}
void solution(int r, int c, int d)
{
while (true)
{
//청소
if (num[r][c] == 0)
{
num[r][c] = 2;
clearCount++;
}
bool failCheck = true;
//동서남북 확인
for (int i = 0; i < 4; i++)
{
//방향에 따른 이동거리
auto v = SelectDirection(d);
int n = r + v.first;
int m = c + v.second;
//회전
d = Rotation(d);
if ((n >= 0 && n < N) && m >= 0 && m < M)
{
//청소가능지 파악
if (num[n][m] == 0)
{
//이동
r += v.first;
c += v.second;
failCheck = false;
break;
}
}
}
//사방이 벽이거나 청소가 된 경우
if (failCheck)
{
switch (d)
{
case 0:
r += 1;
break;
case 1:
c -= 1;
break;
case 2:
r -= 1;
break;
case 3:
c += 1;
break;
}
if ((r < 0 || r > N) || (c <0 || c > M))
{
return;
}
//벽을 만났을때
if (num[r][c] == 1)
{
return;
}
}
}
}
int main()
{
cin >> N >> M;
cin >> R >> C >> D;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
cin >> num[i][j];
}
}
solution(R, C, D);
cout << clearCount << "\n";
return 0;
}
시뮬레이션 문제를 처음 풀어보았다. 생각보다 재미있는 문제였고 지문을 꼼꼼하게 읽어야함을 느꼈다...
나같은 경우 후진할때 벽을 만났을 경우를 빼먹어서 처음 실패를 맞보았다...
다행이 금방 찾아서 다행이었다.
지문을 잘 읽좌~~!!!!
'algorithm > ACMICPC' 카테고리의 다른 글
주사위 윷놀이 - 17825 (0) | 2020.01.31 |
---|---|
원판 돌리기 - 17822 (0) | 2020.01.24 |
연구소 - 14502 (0) | 2019.12.25 |
N-Queen - 9663 (0) | 2019.12.23 |
테트로미노 - 14500 (Solve 2) (0) | 2019.12.14 |
댓글