[백준] 14442번 벽 부수고 이동하기2
[백준] 14442번 벽 부수고 이동하기2
문제 및 입출력
문제 접근
bfs문제이다.
벽을 몇개 부순지에 대해 체크를 하고, 벽이 있을 때, 벽을 부술수 있는 지 체크하면 된다. 메모리 초과 문제가 나와서 조금 시간이 걸렸다.
코드 구현(c++)
#include <iostream>
#include <queue>
#include <cstring>
#include <string>
#define MAX 1000
using namespace std;
bool cache[MAX][MAX][11];
int map[MAX][MAX];
int N,M,K;
int nMove[4] = {0,0,1,-1};
int mMove[4] = {1,-1,0,0};
struct node{
int n,m;
int rem, num;
};
int bfs(){
queue<node> q;
node sNode;
sNode.n = 0; sNode.m = 0; sNode.rem = K; sNode.num = 1;
cache[0][0][K] = true;
q.push(sNode);
while(!q.empty()){
node temp = q.front();
int n = temp.n ; int m = temp.m; int rem = temp.rem; int num = temp.num;
q.pop();
if(n == N-1 && m == M-1){
return num;
}
for(int i = 0 ; i < 4 ; i++){
int nN = n + nMove[i] ; int nM = m + mMove[i];
if(nN < 0 || nN > N-1 || nM < 0 || nM > M-1) continue;
if(cache[nN][nM][rem]) continue;
if(map[nN][nM] == 1 && rem != 0 && !cache[nN][nM][rem-1]){
cache[nN][nM][rem-1] = true;
node pushNode;
pushNode.n = nN; pushNode.m = nM; pushNode.rem = rem - 1; pushNode.num = num + 1;
q.push(pushNode);
}
if(map[nN][nM] == 0){
cache[nN][nM][rem] = true;
node pushNode;
pushNode.n = nN; pushNode.m = nM; pushNode.rem = rem; pushNode.num = num + 1;
q.push(pushNode);
}
}
}
return -1;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
memset(cache, false, sizeof(cache));
cin >> N >> M >> K;
string str;
for(int i = 0 ; i < N ; i++){
cin >> str;
for(int j = 0 ; j < M ; j++){
map[i][j] = str[j] - '0';
}
}
cout << bfs() << "\n";
}
Author And Source
이 문제에 관하여([백준] 14442번 벽 부수고 이동하기2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kpg0518/백준-14442번-벽-부수고-이동하기2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)