문제풀이/백준oj
[백준oj] 1261번 알고스팟
Hyeon-Uk
2020. 12. 29. 02:36
반응형
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;
}
결과는 성공!
반응형