문제
https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어
www.acmicpc.net
구상
그냥 조건을 잘 읽고 조건에서 시키는 대로 구현하기만 하면 된다. 코드로 뭔가 보여드리겠습니다.
코드
굳이 핵심을 뽑자면, left를 저렇게 array로 처리해서 깔끔하게 한 것? 다 저번 포스팅에서 말한 dx, dy 잡는 법 덕분에... 인터넷 세상은 대단하다. 나도 인터넷 세상의 지식적 풍요에 일조하고 싶지만 참 마음처럼 쉽지 않다.
#include<iostream>
using namespace std;
int look_left[4] = {3,0,1,2}; // up right down left -> left up right down
int dx[4] = {-1, 0, 1, 0}; // up right down left
int dy[4] = {0, 1, 0, -1}; // up right down left
int main(int argc, char** argv)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, M;
int **board;
bool **clear;
int now_x, now_y, now_direction;
cin >> N >> M;
cin >> now_x >> now_y >> now_direction;
board = new int*[N];
clear = new bool*[N];
for(int i=0; i<N; i++) {
board[i] = new int[M];
clear[i] = new bool[M];
for(int j=0; j<M; j++) {
cin >> board[i][j];
clear[i][j] = false;
}
}
bool done = false;
bool from_one = true;
int area = 0;
while(!done) {
if(from_one){
//case 1
clear[now_x][now_y] = true;
area += 1;
from_one = false;
}
int i=0;
for(; i<4; i++) {
now_direction = look_left[now_direction]; // case 2-1's first step & case 2-2 : rotate
if (!clear[now_x + dx[now_direction]][now_y + dy[now_direction]] && board[now_x + dx[now_direction]][now_y + dy[now_direction]] != 1) {
//case 2-1 : move
now_x += dx[now_direction];
now_y += dy[now_direction];
from_one = true;
break;
}
}
if(i == 4) {
// returned to the first direction
int back = look_left[look_left[now_direction]];
if(board[now_x + dx[back]][now_y + dy[back]] == 1) {
// case 2-4
done = true;
}
else {
now_x += dx[back];
now_y += dy[back];
}
}
}
cout << area << "\n";
return 0;
}
'PS문제들' 카테고리의 다른 글
[백준] 14888: 연산자 끼워넣기 (0) | 2022.08.26 |
---|---|
[백준] 14889: 스타트와 링크 (0) | 2022.08.26 |
[백준] 14502: 연구소 (0) | 2022.08.25 |
[백준] 14501: 퇴사 (with C++)(2가지 방법) (0) | 2022.08.23 |
[백준] 14500: 테트로미노 (with C++) (0) | 2022.08.23 |
댓글