[프로그래머스]
프로그래머스 리코쳇 로봇 C++
Hevton
2023. 9. 1. 11:03
반응형
처음엔 문제를 스스로 어렵게 만들어 생각하고 있었다.
되게 간단한 문제다.
일반적인 bfs 문제에서 '상', '하', '좌', '우' 로 한칸씩 움직이는 것이 아니라, 쭈우우욱 움직이는 것으로만 생각해서 풀면 된다.
나머지는 똑같다.
근데 처음엔 스스로 문제를 어렵게 만들어 생각하고 있었다. 하마터면 빠져들 뻔 했다.
잘 나와서 다행!
#include <string>
#include <vector>
#include <queue>
using namespace std;
// 우 좌 하 상 - 순서는 의미없음
int mx[4] = {0, 0, -1, 1};
int my[4] = {1, -1, 0, 0};
int visit[100][100]; // 방문 여부이자 depth
int n, m;
int startX, startY;
int endX, endY;
int bfs(int x, int y, vector<string>& board) {
queue<pair<int, int>> que;
que.push({x, y});
visit[x][y] = 1;
while(!que.empty()) {
pair<int, int> top = que.front();
int x = top.first;
int y = top.second;
que.pop();
for(int i = 0; i < 4; i++) {
int tx = x;
int ty = y;
while(true) {
if(tx + mx[i] < 0 || tx + mx[i] >= n || ty + my[i] < 0 || ty + my[i] >= m || board[tx + mx[i]][ty + my[i]] == 'D')
break;
else {
tx += mx[i];
ty += my[i];
}
}
if(visit[tx][ty] == 0) {
visit[tx][ty] = visit[x][y] + 1;
que.push({tx, ty});
if(board[tx][ty] == 'G')
return visit[tx][ty];
}
}
}
return 0;
}
int solution(vector<string> board) {
int answer = 0;
n = board.size();
m = board[0].length();
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(board[i][j] == 'R') {
startX = i; startY = j;
} else if(board[i][j] == 'G') {
endX = i; endY = j;
}
}
}
return bfs(startX, startY, board) - 1;
}
반응형