https://www.acmicpc.net/problem/14503
시뮬레이션 문제로 문제에 제시된 바와 같이
로봇청소기의 움직임을 진행하면서 더이상 갈 곳이 없을 때 종료해주면 된다.
주의할 점은 현재의 진행 방향을 기준으로 왼쪽을 볼 때
(진행방향+3)%4을 통해 방향을 확인해주면 된다.
예를들어 현재 방향이 0일 때(북)
각 진행 방향에서 왼쪽을 확인하는 과정은 다음과 같다.
1) (0+3)%4= 3 (서쪽)
2) (3+3)%4 = 2 (남쪽)
3) (2+3)%4 = 1 (동쪽)
4) (1+3)%4 = 0(북쪽)
이렇게 3씩 더해주며 현재 방향에서 왼쪽을 확인하다보면 최종적으로 기존에 바라보던 방향이 나오게 된다.
만약 갈곳이 없다면 후진 유무를 체크해준 뒤에, 후진도 불가능하다면 종료하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <iostream> using namespace std; //0:북, 1: 동, 2:남, 3:서 int dy[4]={-1,0,1,0}; int dx[4]={0,1,0,-1}; int main(){ int N,M; int r,c,d; int map[51][51]={0}; int visited[51][51]={0}; //청소 유무 cin>>N>>M; cin>>r>>c>>d; for(int i=0;i<N;i++){ for(int j=0;j<M;j++){ scanf("%d",&map[i][j]); } } int ans=0; while(true){ //후진으로 오는 경우도 있기 때문에 청소 유무 체크 if(!visited[r][c]){ ans++; visited[r][c]++; } bool check=false; for(int i=0;i<4;i++){ d=(d+3)%4; //현재 위치에서 왼쪽 방향 회전 int nr=r+dy[d]; int nc=c+dx[d]; if(nr<0 || nr >=N || nc<0 || nc>=M) continue; if(map[nr][nc] || visited[nr][nc]) continue; check=true; r=nr; c=nc; break; } //후진 여부 if(!check){ r=r+dy[(d+2)%4]; c=c+dx[(d+2)%4]; if(r<0 || r >=N || c<0 || c>=M || map[r][c]) break; } } cout<<ans<<endl; return 0; } | cs |
'알고리즘(BOJ) > 시뮬레이션' 카테고리의 다른 글
백준 17140번 - 이차원 배열과 연산 (0) | 2019.10.14 |
---|---|
백준 3019번 - 테트리스 (1) | 2019.07.21 |
백준 14890번 - 경사로 (0) | 2019.07.03 |
백준 1764번 - 듣보잡 (0) | 2019.05.14 |
백준 17144번 - 미세먼지 안녕! (0) | 2019.05.13 |