DOTY

17) 백준 2665 - 미로만들기 본문

Algorithm/BFS&DFS

17) 백준 2665 - 미로만들기

증식세포 2023. 4. 12. 16:03
728x90
반응형

2665번: 미로만들기 (acmicpc.net)

 

2665번: 미로만들기

첫 줄에는 한 줄에 들어가는 방의 수 n(1 ≤ n ≤ 50)이 주어지고, 다음 n개의 줄의 각 줄마다 0과 1이 이루어진 길이가 n인 수열이 주어진다. 0은 검은 방, 1은 흰 방을 나타낸다.

www.acmicpc.net


#include <bits/stdc++.h>

using namespace std;

int N;
int x_p[4] = {0, 0, 1, -1};
int y_p[4] = {1, -1, 0, 0};
int room[50][50] = {0, };
int check[50][50] = {0, };

void bfs() {
	queue<pair<int, int> > q;
	int x, y;
	q.push(make_pair(0, 0));
	check[0][0] = 0;
	
	while(!q.empty()) {
		x = q.front().first;
		y = q.front().second;
		q.pop();
		
		for(int i = 0; i < 4; i++) {
			int xp = x + x_p[i];
			int yp = y + y_p[i];
			if(xp < N && xp >= 0 && yp < N && yp >= 0 ) {
				if(room[xp][yp] == 1) {
					if(check[xp][yp] > check[x][y]) {
						check[xp][yp] = check[x][y];
						q.push(make_pair(xp, yp));
					}
				}
				else {
					if(check[xp][yp] > check[x][y] + 1) {
						check[xp][yp] = check[x][y]+1;
						q.push(make_pair(xp, yp));
					}
				}
			}
		}
	}
}

int main(void) {
	cin >> N;
	char c;
	for(int i = 0; i < N; i++) {
		for(int j = 0; j < N; j++) {
			cin >> c;
			room[i][j] = c - '0';
			check[i][j] = 99999999;
		}
	}
	
	bfs();
	
	cout << check[N-1][N-1];
}

처음에는 문의 색을 바꾸고 bfs 돌리자! 라고 생각했는데 막막했다.

 

다른 방법을 생각했는데 차라리 그냥 검은 방을 들어가고 검은 방의 갯수를 세는 방법으로 바꾸었다.

check에는 검은 방을 들어간 최소 갯수를 저장해두고 목적지에 도달하면 목적지의 check값을 출력해주었다.

 

음.. 쉬운듯 어려운듯 쉬운듯 ..음

728x90
반응형

'Algorithm > BFS&DFS' 카테고리의 다른 글

19) 백준 9663 - N-Queen  (1) 2023.04.22
18) 백준 1707 - 이분 그래프  (0) 2023.04.13
16) 백준 1520 - 내리막 길  (0) 2023.04.05
15) 백준 12100 - 2048 (Easy)  (0) 2023.04.02
14) 백준 13023 - ABCDE  (0) 2023.03.30
Comments