-
[백준] 13901번 로봇문제 풀이 2020. 7. 15. 21:10
13901번 로봇
문제
해빈이는 로봇을 좋아한다. 로봇을 가지고 놀던 해빈이는 로봇에게 계속해서 명령을 내려 움직이는 대신 이동할 방향을 미리 지정하여 로봇이 알아서 움직이도록 하였다. 이 로봇은 다음과 같은 규칙을 가지고 움직인다.
- 로봇은 사용자가 지정한 방향을 일직선으로 움직인다.
- 이동 중 벽이나 방문한 지역, 장애물을 만날 경우 로봇은 사용자가 지정한 다음 방향으로 움직인다.
- 사용자가 지정한 다음 방향이 없다면 맨 처음 방향으로 돌아가서 위의 과정을 반복한다.
- 로봇이 움직일 수 없을 경우 동작을 멈춘다.
입력으로 방의 크기와 장애물의 개수, 각 장애물들의 위치, 로봇의 시작 위치, 이동 방향의 순서가 주어졌을 때 로봇이 멈추는 위치를 출력하시오. 위치 (0, 0)은 왼쪽 위를 가리키며 방의 크기가 R * C일 때 오른쪽 아래 위치는 (R - 1, C - 1)이 된다. (R은 세로의 크기를 C은 가로의 크기를 말한다.)
입력
첫 번째 줄에는 방의 크기 R, C(3 ≤ R, C ≤ 1,000)가 입력된다. 두 번째 줄에는 장애물의 개수 k(0 ≤ k ≤ 1,000)가 입력된다. 다음 k개의 줄에는 각 장애물 위치 br(0 ≤ br ≤ R – 1), bc(0 ≤ bc ≤ C - 1)가 주어진다. 그 다음 순서대로 로봇의 시작 위치 sr(0 ≤ sr ≤ R – 1), sc(0 ≤ sc ≤ C - 1)와 이동 방향의 순서(총 4개가 입력되는데 1은 위 방향, 2은 아래 방향, 3은 왼쪽 방향, 4는 오른쪽 방향을 나타낸다)가 한 줄씩 입력된다. 로봇의 시작위치에 장애물이 있는 경우는 없다.
출력
로봇의 마지막 위치 r, c를 출력한다.
풀이)
dfs를 이용해서 푼 문제이다.
로봇은 벽과 장애물, 이미 자신이 방문했던 곳은 갈 수 없다.
따라서 장애물과 자신이 방문했던 곳은
bool visited[1000][1000] // visited[][]= true 로 체크해 주었다.
과정은 이러하다.
1. 로봇의 현재위치에서 지정한 방향으로 갈 수 있는지 확인
1.1 갈 수 있다면 이동한 후 다시 1번 수행
1.2 갈 수 없다면, 다음 방향을 살펴봄 -> 다음 방향으로 갈 수 있다면 이동한 후 다시 1번 수행
갈 수 없다면 다른 방향 또 살핌
2. 총 4개의 방향으로 모두 갈 수 없다면 로봇은 더 이상 움직일 수 없음 -> 종료
주의
로봇이 맨 처음 위치한 곳도 방문 표시를 해줘야한다.
코드)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include <stdio.h>#include <algorithm>using namespace std;int R, C;int k;bool visited[1000][1000];pair<int, int> robot;//로봇 위치int direc[4];//사용자가 저장한 이동방향int dy[5] = { 0,-1,1,0,0 }; // 1 = 위, 2 = 아래, 3 = 왼쪽, 4 = 오른쪽int dx[5] = { 0,0,0,-1,1 };void dfs(int y,int x,int dir) {bool fail = true;int cnt = 4; //현재방향 + 3개의 다른 방향 체크 = 총 4번 체크while (cnt--) {int ny = y + dy[direc[dir]];int nx = x + dx[direc[dir]];if (ny >= 0 && ny < R && nx >= 0 && nx < C) {if (!visited[ny][nx]) {visited[ny][nx] = true;dfs(ny, nx, dir);fail = false;break;}}dir = (dir + 1) % 4;}//4방향 모두 살폈는데 더 이상 움직일 수 없으면 동작 stopif (fail) {robot.first = y;robot.second = x;}}int main() {scanf("%d %d %d", &R, &C,&k);for (int i = 0; i < k; i++) {int br, bc;scanf("%d %d", &br, &bc);visited[br][bc] = true; //장애물 표시}scanf("%d %d", &robot.first, &robot.second);visited[robot.first][robot.second] = true;for (int i = 0; i < 4; i++) {scanf("%d", &direc[i]);}dfs(robot.first, robot.second, 0);printf("%d %d", robot.first, robot.second);return 0;}cs '문제 풀이' 카테고리의 다른 글
[백준] 2151번 거울설치 (0) 2020.07.17 [백준] 1016번 제곱 ㄴㄴ수 (0) 2020.07.16 [백준] 14620번 꽃길 (0) 2020.07.14 [백준] 14923번 미로 탈출 (0) 2020.07.14 [백준] 13537번 수열과 쿼리1 (0) 2020.07.13