BOJ 2178 - 미로 탐색
- 붙어있는 숫자로 입력이 주어진다. 입력을 받고 BFS를 돌리면 된다.
문제 풀이
소스코드
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
#include<cstdio>
#include<iostream>
#include<string>
#include<vector>
#include<queue>
#include<utility>
using namespace std;
int di[4]={-1, 0, 1, 0}, dj[4]={0, 1, 0, -1};
int main()
{
int n, m;
scanf("%d %d", &n, &m);
vector<vector<int>> maze(n+2, vector<int>(m+2, 0)), visited(n+2, vector<int>(m+2, 0));
for(int i=1;i<=n;i++){
string s;
getline(cin, s);
while(s=="\0") getline(cin, s);
for(int j=1;j<=s.length();j++) maze[i][j]=s[j-1]-'0';
}
queue<pair<int, int>> q;
q.push(make_pair(1001, 1));
visited[1][1]=1;
while(!q.empty()){
int ci=q.front().first/1000, cj=q.front().first%1000, pcnt=q.front().second;
for(int i=0;i<4;i++){
int ni=ci+di[i], nj=cj+dj[i];
if(maze[ni][nj] && visited[ni][nj]==0){
if(ni==n && nj==m){
printf("%d", pcnt+1);
return 0;
}
q.push(make_pair(ni*1000+nj, pcnt+1));
visited[ni][nj]=1;
}
}
q.pop();
}
}
풀고나서
-
입력을
string
으로 처리해서 헤맸다. 항상 스트링 처리만 나오면 정신없어진다. 풀고나서 다른 코드들을 봤는데 기가막힌 것을 찾았다.scanf
의 포맷에서 지원되는 기능인데scanf("%1d", &m[i][j])
가 가능하다는 것이다. 다른 타입에 대해서는 모르겠지만 정수라도 되는게 어디냐,,, -
DFS를 돌리면 도착지점에 도달할 때마다 하나하나 경로길이를 저장해놓아야 하지만 BFS를 이용하면 처음 도착지점에 도달할 때 프로그램을 종료시키면 된다. 이 문제에서는 입력이 100x100이라 상관없지만 입력이 커지면 BFS가 훨씬 효율적일 것이다.
Leave a comment