맛있는감귤

BOJ : 1261 알고스팟 본문

알고리즘/백준 알고리즘

BOJ : 1261 알고스팟

맛있는감귤 2017. 4. 28. 00:48

문제 : https://www.acmicpc.net/problem/1261

일반적인 미로찾기에서 아주 사알짝 업그레이드 된 문제.

1. 벽 어느 벽을 부쉈냐에 따라 이동경로가 달라질 수 있기 때문에 주의하도록 하자.

2. 또 최소 이동거리가 아닌 부순 벽의 개수가 최소가 되어야 하기 때문에 모든 이동경로를 비교해야 한다.


비슷한 문제

2206 벽 부수고 이동하기 / 해설

14442 벽 부수고 이동하기 2 /  해설


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
#include <cstdio> #include <queue> using namespace std; struct Pos{ public: int r,c,crash; Pos(){} Pos(int _r,int _c,int _crash) : r(_r), c(_c), crash(_crash) {} }; int N,M,ans=987654321; char map[102][102]; bool visited[102][102][1003]; int pr[4] = {1,-1,0,0}; int pc[4] = {0,0,1,-1}; queue<Pos> q; int main(){ scanf("%d%d",&M,&N); for(int i=0;i<N;i++) scanf("%s",map[i]); q.push(Pos(0,0,0)); visited[0][0][0]=1; while(!q.empty()){ int r = q.front().r , c = q.front().c, cnt = q.front().crash; q.pop(); //printf("%d %d %d\n",r,c,cnt); if(r==N-1 && c==M-1){ if(ans > cnt) ans = cnt; } for(int i=0;i<4;i++){ int nr = r+pr[i], nc = c+pc[i], nCnt=cnt; if(nr<0 || nc<0 || nr>=N || nc>=M) continue; if(visited[nr][nc][nCnt]) continue; if(map[nr][nc]=='1') { nCnt += 1; if(visited[nr][nc][nCnt]) continue; } visited[nr][nc][nCnt]=1; q.push(Pos(nr,nc,nCnt)); } } printf("%d\n",ans); } Colored by Color Scripter
cs


'알고리즘 > 백준 알고리즘' 카테고리의 다른 글

BOJ : 12100 2048(Easy)  (0) 2017.04.28
BOJ : 13459 째로탈출  (2) 2017.04.28
BOJ : 1074 Z  (2) 2017.04.28
BOJ : 5214 환승  (2) 2017.04.28
BOJ : 14226 이모티콘  (2) 2017.04.28