백준 코딩

백준2178번:미로 탐색

까르르꿍꿍 2021. 10. 8. 17:59

https://www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

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

www.acmicpc.net

이 문제는 좌표(n,m)까지 최단 경로를 구하는 것이다. 최단 경로를 구하는 문제는 DFS보다 BFS가 훨씬 효율적이다.

방문하면 그값을 전에 값에 1씩더하면서 가면 n,m을 도달하게 되고 그 값이 즉 값이다. 그리고 다른 경로로 온다고 해도 이미 최단으로 방문되었으므로 값이 바뀔 일은 없다.

1   1 1 1  
1   1   1 1
1   1   1  
1   1   1  
1 1 1   1 1
1   11 12 13  
2   10   14 15
3   9   15  
4   8   16  
5 6 7   17 18

이렇게 방문하기 전에 값을 1씩 더하면 맨 끝에 도달한 값이 나오고 그게 최단경로이다.

#include<iostream>
#include <queue>
#include <cstdio>
using namespace std;
#pragma warning(disable : 4996)
int px[4] = { 1,-1,0,0 };
int py[4] = { 0,0,1,-1 };
int d[100][100];                 //1과 0 값 넣기
bool check[100][100];             //방문 체크
int sum[100][100];              //몇번쨰 방문인지 적는 배열
int main() {
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int k = 0; k < m; k++) {
			scanf("%1d", &d[i][k]);
		}
	}
	queue<pair<int, int>> q;
	q.push(make_pair(0, 0));
	check[0][0] = true;
	sum[0][0] = 1;
	while (!q.empty()) {
		int x = q.front().first;
		int y = q.front().second;
		q.pop();
		for (int i = 0; i < 4; i++) {
			int nx = x + px[i];
			int ny = y + py[i];
			if (0 <= nx && nx < n && 0 <= ny && ny < m) {        //칸의 위 아래 오른쪾 왼쪾이 지정된 범위 안일 경우
				if (check[nx][ny] == false && d[nx][ny] == 1) {  //방문안했고 값이 1인 경우 
					q.push(make_pair(nx, ny));
					sum[nx][ny] = sum[x][y] + 1;           //그 전칸에 1을 더해준다
					check[nx][ny] = true;              //방문처리
				}
			}
		}
	}
	printf("%d", sum[n - 1][m - 1]);        //최단경로 값
	return 0;
}