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 |
Tags
- 파이썬sort
- 도커설치하는법
- 출처 코딩셰프
- 스프링사진업로드
- WAS웹서버
- vm도커설치하는법
- dockerinstall
- 서버에도커설치
- 멀티폼
- centos도커설치
- 인스타클론
- 출처 메타코딩
- 스프링부트팔로우취소
- 스프링부트팔로잉
- 스프링부트중복예외처리
- 스프링부트사진올리기
- 스프링부트api
- 출처 문어박사
- 우분투도커설치
- 출처 따배도
- 스프링사진
- 스프링익셉션처리
- 스프링구독
- springboot_exception_handler
- 스프링부트구독취소
- ssh도커설치
- 스프링이미지업로드
- 스프링부트서버에사진전송
- 스프링부트
- 출처 노마드코더
Archives
- Today
- Total
MakerHyeon
[백준] 2178번 미로 탐색(python,c++) 본문
https://www.acmicpc.net/problem/2178
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net
SOLUTION CODE
# PYTHON
from collections import deque
dy = (0, 1, 0, -1)
dx = (1, 0 ,-1, 0)
N,M = map(int,input().split())
board = [input() for _ in range(N)] # String으로 받음
def is_valid_coord(y,x):
return 0<=y<N and 0<=x<M
def bfs():
chk = [[False] * M for _ in range(N)]
chk[0][0] = True
dq = deque()
dq.append(0,0,1)
while dq:
y, x, d= dq.popleft()
if y == N-1 and x = M -1:
return d
nd = d+1
for k in range(4):
ny = y + dy[k]
nx = x + dx[k]
if is_valid_cood(ny,nx) and board[ny][nx] == '1' and not chk[ny][nx]:
chk[ny][nx] = True
dq.append((ny,nx,nd))
bfs()
# C++
#include <iostream>
#include <queue>
#define MAX 101
using namespace std;
int N,M;
int maze[MAX][MAX];
int visited[MAX][MAX];
int dist[MAX][MAX]; // 이동칸 수
int dy[4] = {0,1,0,-1};
int dx[4] ={1,0,-1,0};
queue<pair<int,int>> q;
void bfs(int start_x,int start_y){
visited[start_x][start_y] = 1; //방문체크
q.push(make_pair(start_x,start_y));
dist[start_x][start_y]++;
// 모든 좌표를 탐색할 때까지 반복
while(!q.empty()){
// queue 첫번째 좌표 꺼내기
int x = q.front().first;
int y = q.front().second;
q.pop();
for(int i=0;i<4;++i){
int y_new = y+dy[i];
int x_new = x+dx[i];
// 유효범위+방문X+이동가능확인
if((0<=x_new && x_new <N) && (0<=y_new && y_new < M)
&& !visited[x_new][y_new] && maze[x_new][y_new] ==1 )
{
visited[x_new][y_new] = 1; // 방문체크
q.push(make_pair(x_new,y_new)); // 큐에 삽입
dist[x_new][y_new] = dist[x][y] +1;
}
}
}
}
int main() {
cin >> N, M; // 미로크기
for(int i=0;i<N;i++){
String row;
cin >> row; // ex_110111...
for(int j=0;j<M;++j){ // 행별 좌표저장
maze[i][j] = row[j] - '0'; //문자->숫자 변환
}
}
bfs(0,0);
cout<<dist[N-1][M-1];
}
'Algorithm > backjoon' 카테고리의 다른 글
[백준] 10815번 숫자 카드 (python,c++) (0) | 2023.02.17 |
---|---|
[백준] 2512번 예산 (python,c++) (0) | 2023.02.17 |
[백준] 11724번 연결 요소의 개수(python,c++) (0) | 2023.02.14 |
[백준] 1449번 수리공 항승 (0) | 2023.02.13 |
[백준] 2309번 일곱 난쟁이 (Python,C++) (0) | 2023.02.12 |
Comments