본문 바로가기
백준

백준 2178 미로 탐색

by 콩순이냉장고 2020. 8. 6.

문제 URL : https://www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

 

문제접근법 : 2차원으로 bfs를 이용하는 간단한 문제입니다. 연결표현은 좌우상하 총 4개의 연결선이 되겠고 

bfs를 이용하여 0,0 에서 n-1,m-1로 한칸한칸 움직이면 가장 빠른 경로로 갈수있는 간단한 문제입니다.

 

작년에 c++ 로 풀어서 이번엔 다시풀었을때 파이썬으로 풀었습니다.

파이썬의 입력방식과 2차원 배열선언이 어려워서 많이 찾게되었지요

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
# -*- coding: euc-kr -*- 
dy=[-1,0,1,0]
dx=[0,1,0,-1]
n,m=map(int,input().split())
visit= [[0]*for _ in range(n)] #2차원 배열 선언
board= [[0]*for _ in range(n)] 
for i in range(0,n) : 
    s=input()#문자열입력
    for j in range(0,m):
        board[i][j]=int(s[j])#문자열을 하나하나 int형으로 바꿈
 
q=[] #리스트로 큐를 이용할수있음
q.append([0,0,1])
while q:
    y,x,cnt=q.pop(0)
    if y==n-1 and x==m-1:
        print(cnt)
        break
    for i in range(0,4):
        ny =y+dy[i]
        nx = x+dx[i]
        if 0<= ny<and 0<=nx<m:
            if visit[ny][nx]==0 and board[ny][nx]==1:
                q.append([ny,nx,cnt+1])
                visit[ny][nx]=1
 
 
 
 
cs

 

c++ 코드:

 

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
#include <iostream>
#include<cstdio>
#include <algorithm>
#include <vector>
#include<string>
#include <queue>
using namespace std;
int n,m;
int a[101][101];
bool visit[101][101];
int dy[4]={-1,0,1,0};
int dx[4]={0,1,0,-1};
void bfs()
{
    queue<pair<int,int>> q;
    q.push(make_pair(1,1));
    while(!q.empty())
    {
        int qsize=q.size();
        while(qsize--)
        {
            int y=q.front().first;
            int x=q.front().second;
            q.pop();
            for(int i=0;i<4;i++)
            {
                int ny=y+dy[i];
                int nx=x+dx[i];
                if(1<=ny&&ny<=n&&1<=nx&&nx<=m&&a[ny][nx]==1&&visit[ny][nx]==0)
                {
                    a[ny][nx]=a[y][x]+1;
                    visit[ny][nx]=1;
                    q.push(make_pair(ny,nx));
                }
            }
        }
    }
 
}
 
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        string s;
        cin>>s;
        for(int j=0;j<m;j++)
            a[i][j+1]=s[j]-'0';
    }
    bfs();
    cout<<a[n][m]<<endl;
}
 
cs

 

 

지금보니 방식은 비슷한데 풀이방법은 작년에 풀었던 방식과는 약간 다르네요

파이썬 코드가 간단한데 아직 파이썬이 입숙하지 않아서 c++이 저한테는 아직까진 더 편하게 느껴집니다.

 

궁금한점이 혹은 질문사항이 있다면 언제든 댓글을 이용해주시길 바랍니다.

 

'백준' 카테고리의 다른 글

백준 1956 운동  (0) 2020.08.07
백준 11779 최소비용 구하기 2  (0) 2020.08.07
백준 1822 차집합  (0) 2020.08.06
백준 17088 등차수열 변환  (0) 2020.08.05
백준 16197 두 동전  (0) 2020.07.31