Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 삼성 기출
- 그리디
- 백준
- hackerrank
- 해커랭크
- 시뮬레이션
- dynamic programming
- dfs
- 소수
- 알고리즘
- 동적 계획법
- 백트래킹
- 다이나믹 프로그래밍
- koitp
- sw expert academy
- SWEA
- PS
- 완전탐색
- 잠실
- 스택
- 브루트포스
- C++
- 구현
- DP
- BFS
- 맛집
- 삼성 SDS 대학생 알고리즘 특강
- Algorithm
- BOJ
- 에라토스테네스의 체
Archives
- Today
- Total
펭로그
[C++] 백준 BOJ 14503 로봇 청소기 본문
문제링크 : https://boj.kr
시뮬레이션 문제로 주어진 조건에 맞게 그대로 풀어내려가면 되는 문제이다.
문제 접근 방법은 DFS 방식이랑 크게 차이 없지만 DFS로 풀면 스택이 계속 쌓이기 때문에 이렇게 푸는 편이 더 좋지 않을까 생각한다.
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 68 69 70 71 72 73 74 75 76 77 78 | // BOJ 14503 로봇 청소기 #include <iostream> #include <vector> using namespace std; struct pt{ int x, y, d; }; const int dx[] = {-1, 0, 1, 0}; const int dy[] = {0, 1, 0, -1}; void turn(int& dir){ dir = --dir < 0 ? 3 : dir; // 왼쪽 회전 } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); // freopen("../input.txt", "r", stdin); int N, M; int x, y; int nx, ny; int dir; // 0-북 1-동 2-남 3-서 int ans = 0; cin >> N >> M >> x >> y >> dir; x++, y++; // 계산 편의상 1씩 더함 vector<vector<int> > map(N + 2, vector<int>(M + 2, 1)); for(int i = 1; i <= N; i++) for (int j = 1; j <= M; j++) cin >> map[i][j]; while(true){ // 현재 위치를 청소한다. if(map[x][y] == 0){ map[x][y] = 2; ans++; } bool chk = false; // 현재 위치에서 현재 방향을 기준으로 // 왼쪽방향부터 차례대로 탐색을 진행한다. for(int i = 0; i < 4; i++) { turn(dir); nx = x + dx[dir]; ny = y + dy[dir]; // 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, if (map[nx][ny] == 0) { // 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다. chk = true; // 1번으로 가기 위한 플래그 변수 x = nx; y = ny; break; } } if(chk) // 1번 ㄱㄱ continue; // 반대방향 nx = x - dx[dir]; ny = y - dy[dir]; // 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, // 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다. if(map[nx][ny] != 1){ x = nx; y = ny; continue; } // 네 방향 모두 청소가 이미 되어있거나 벽이면서, // 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다. else break; } cout << ans; return 0; } | cs |
'Study > PS(Algorithm)' 카테고리의 다른 글
[C++] 백준 BOJ 11048 이동하기 (0) | 2018.09.17 |
---|---|
Codeforces Round #509 (Div. 2) 후기 (0) | 2018.09.16 |
[C++] 백준 BOJ 7562 나이트의 이동 (0) | 2018.09.14 |
[C++] 백준 BOJ 9465 스티커 (0) | 2018.09.13 |
[C++] 백준 BOJ 2805 나무 자르기 (0) | 2018.09.11 |
Comments