728x90
반응형
https://www.acmicpc.net/problem/14503
#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;
#define MAP_SIZE 51
int N, M;//행 열
int map[MAP_SIZE][MAP_SIZE];
int dy[] = { -1,0,1,0 };
int dx[] = { 0,1,0,-1 };
int y, x, dir;
bool safe(int y, int x) {
return 0 <= y && y < N && 0 <= x && x < M;
}
void init() {
scanf("%d %d", &N, &M);
scanf("%d %d %d", &y, &x, &dir);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%d", &map[i][j]);
}
}
}
void play() {
int clean_room = 1;
while (1) {// 무한 반복
if (map[y][x] == 0) {//현재 위치를 청소한다.
map[y][x] = ++clean_room;
}
//현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다.
int i = 0;
int cdir = dir;
for (i = 0; i < 4; i++) {
cdir--;
if (cdir == -1)cdir = 3;
if (safe(y + dy[cdir], x + dx[cdir]));
//왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다.
if (map[y + dy[cdir]][x + dx[cdir]]==0) {
y = y + dy[cdir]; x = x + dx[cdir];
dir = cdir;
break;
}
}
//왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다.
if (i == 4) {
//네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.
if (map[y - dy[dir]][x - dx[dir]] !=1) {
y -= dy[dir]; x -= dx[dir];
}
else {
break;
}
//네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.
}
//로봇 청소기는 이미 청소되어있는 칸을 또 청소하지 않으며, 벽을 통과할 수 없다.
}
cout << clean_room - 1<<endl;
}
int main(void) {
init();
play();
return 0;
}
여기서 포인트는 만약에 맵 상에서 체크하면서 가게 한다면 체크하는 변수의 초기값을 1로 해서
++변수 이렇게 하거나 2로해서 변수++하거나 해서 체크를 해줘야 합니다.
이게 무슨 소리지 하시는 분 들이 있는데 배열에 1이라는 벽이 있으니 그 벽이랑 숫자가 안겹치게 배열에
체크해준다 생각하시면 좀더 이해하기 쉽습니다.
그리고 항상 조건에 맞게 시뮬은 주면 문제가 바로 풀리니 걱정하지마시고 최대한 구현력을 높이자.
728x90
반응형
'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글
15683 감시 (0) | 2020.07.23 |
---|---|
프로그래머스 숫자 야구 (0) | 2020.07.22 |
프로그래머스 모의고사 (0) | 2020.07.20 |
프로그래머스 소수찾기 (0) | 2020.07.20 |
17070 파이프 옮기기1 (0) | 2020.07.20 |
댓글