-
반응형
1261번: 알고스팟
첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미
www.acmicpc.net
n과 m값이 작아서 bfs미로찾기로 해서, 해당 maze[i][j]마다 지나오며 부셨던 벽의 최소값을 저장해둔뒤, 도착지점의 최솟값을 출력하는 방식으로 짜보았다.
#include<iostream> #include <algorithm> #include<queue> #define MAX 100*100+1 using namespace std; int maze[100][100]; int result[100][100]; int check[100][100] = { 0 }; int N,M; int mv[4][2] = { {0,1},{0,-1},{1,0},{-1,0} }; void bfs() { queue<pair<int, int>> q; q.push(make_pair(0,0)); while (!q.empty()) { int x = q.front().first; int y = q.front().second; check[x][y] = 1; q.pop(); for (int i = 0; i < 4; i++) { int nx = x + mv[i][0]; int ny = y + mv[i][1]; if (nx >= 0 && nx < M&&ny >= 0 && ny < N) { if (check[nx][ny] == 0) { q.push(make_pair(nx, ny)); //다음 발디딜 셀에 저장되어있는 최소값보다, 해당셀의 최소값+다음 셀의 벽유무 //값을 비교 후에 최소값 저장 if (result[nx][ny] > result[x][y] + maze[nx][ny]) { result[nx][ny] = result[x][y] + maze[nx][ny]; } } } } } } int main() { cin >> M>>N; char data; for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { cin >> data; maze[i][j] = data - '0'; result[i][j] = MAX; } } result[0][0] = 0; bfs(); cout << result[N - 1][M - 1]; return 0; }
이렇게 했지만 결과는
내생각에는 n과 m의 값이 최대값인 100이됐을때 bfs를 돌며 쌓이는 큐의 메모리가 초과된다 생각했다.
그래서 다음으로 dfs로 풀어보았다.
#include<iostream> #include <algorithm> #include<utility> #include<queue> #define MAX 100*100+1 using namespace std; int maze[100][100]; int result[100][100]; int check[100][100] = { 0 }; int N, M; int mv[4][2] = { {0,1},{0,-1},{1,0},{-1,0} }; void dfs(int x,int y,int cnt) { if (result[x][y] <= cnt) return;//cnt가 더 크다면 이 길은 최솟값이 아니니 return else result[x][y] = cnt; //아니면 cnt저장 후 계속 //도착하면 return if (x == N - 1 && y == M - 1) { return; } for (int i = 0; i < 4; i++) { int nx = x + mv[i][0]; int ny = y + mv[i][1]; //발디딜 수 있는 곳이라면 if (nx >= 0 && nx < N&&ny >= 0 && ny < M&&check[nx][ny]==0) { //dfs실행 check[nx][ny] = 1; dfs(nx, ny, cnt + maze[nx][ny]);//벽의 개수는 지금까지 부신 벽+다음셀의 벽 유무 check[nx][ny] = 0; } } } int main() { cin >> M >> N; char data; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cin >> data; maze[i][j] = data - '0'; result[i][j] = MAX; } } dfs(0,0,0); cout << result[N - 1][M - 1]; return 0; }
결과는 성공!
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준oj] 5676번 음주코딩 (0) 2020.12.29 [백준oj] 1389번 케빈 베이컨의 6단계 법칙 (0) 2020.12.29 [백준oj] 1300번 k번째 수 (0) 2020.12.29 [백준oj] 1976번 여행가자 (0) 2020.12.29 [백준oj] 5676번 음주코딩 (0) 2020.12.23 댓글