본문 바로가기
코딩테스트_백준풀이

미로탐색 #2178 c++ 문제풀이

by wanna_dev 2023. 10. 29.

 

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

 

2178번: 미로 탐색

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

www.acmicpc.net

bfs문제는 이제 유형을 보면 바로 알아챌 수 있다.

알게 된 점은 구현에서 

이제 큐나 다른 것을 건들이지 않고(bfs의 최초 형태를 살리는 방향으로), 다른 자료구조를 추가해서 탐색에 대한 기록을 해주는 것이 유리하다는 것을 깨달았다.

 

경로를 기록하면서 갈수있는 방향에 대한 ans값을 기록한다.

그리고, 도착지점의 ans값을 출력하면 된다.

 

 

#include<iostream>
#include<string>
#include<map>
#include<queue>
using namespace std;


int graph[101][101];
int visited[101][101];
int ans[101][101];

int N, M;
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};


void bfs(int y, int x) {
	queue<pair<int, int>> q;
	q.push(make_pair(y, x));

	ans[y][x] = 1;
	

	while (!q.empty()) {

		int y = q.front().first;
		int x = q.front().second;
		visited[y][x] = 1;

		q.pop();
		
		for (int i = 0; i < 4; i++) {
			int ny = y + dy[i];
			int nx = x + dx[i];
			if (nx < 0 || nx >= M || ny < 0 || ny >= N)
				continue;
			if (graph[ny][nx] == 0)
				continue;
			if (graph[ny][nx] == 1 && visited[ny][nx] == 0)
			{
				ans[ny][nx] = ans[y][x] + 1;
				q.push(make_pair(ny, nx));
				visited[ny][nx] = 1;
			}
		}
	}
	

}
int main() {
	
	cin >> N >> M;
	string temp;
	for (int i = 0; i < N; i++) {
		cin >> temp;
		for (int j = 0; j < M; j++) {
			if (temp[j] == '0')
				graph[i][j] = 0;
			else
				graph[i][j] = 1;
		}
	}
	//for (int i = 1; i <= N; i++) {
	//	for (int j = 1; j <= M; j++) {
	//		cout << graph[i][j] << " ";
	//	}
	//	cout << endl;
	//}
	bfs(0,0);
	//for (int i = 0; i < N; i++) {
	//	for (int j = 0; j < M; j++)
	//		cout << ans[i][j]<< " ";
	//	cout << '\n';
	//}
    cout << ans[N-1][M-1] << end;
	return 0;
}

'코딩테스트_백준풀이' 카테고리의 다른 글

적록색약 #10026 c++ 풀이  (1) 2023.11.01
단지번호붙이기 #2667 c++ 풀이  (0) 2023.10.29
1로 만들기 #1463 c++ 풀이  (1) 2023.10.28
경로찾기 #11403 c++ 풀이  (1) 2023.10.27
DSLR #9019 c++ 풀이  (0) 2023.10.26