https://programmers.co.kr/learn/courses/30/lessons/87694
#include <string>
#include <vector>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
const int MAX = 105;
struct MOVE { int x, y; };
MOVE mv[4] = { {0,1}, {0,-1}, {1,0}, {-1,0} }; //상, 하, 좌, 우
int map[MAX][MAX][4];
int visited[MAX][MAX];
struct INFO { int x, y, count; };
int solution(vector<vector<int>> rectangle, int characterX, int characterY, int itemX, int itemY) {
int answer;
memset(visited, -1, sizeof(visited));
memset(map, -1, sizeof(map));
for (int i = 0; i < rectangle.size(); i++) {
int si = rectangle[i][0]*2; // 2
int sj = rectangle[i][1]*2; //2
int ei = rectangle[i][2]*2; //10
int ej = rectangle[i][3]*2; //14
for (int ii = si; ii <= ei; ii++) {
map[ii][sj][2] = 1;
map[ii][sj][3] = 1;
map[ii][ej][2] = 1;
map[ii][ej][3] = 1;
}
for (int jj = sj; jj <= ej; jj++) {
map[si][jj][0] = 1;
map[si][jj][1] = 1;
map[ei][jj][0] = 1;
map[ei][jj][1] = 1;
}
}
for (int i = 0; i < rectangle.size(); i++) {
int si = rectangle[i][0] * 2; // 2
int sj = rectangle[i][1] * 2; //2
int ei = rectangle[i][2] * 2; //10
int ej = rectangle[i][3] * 2; //14
for (int jj = sj + 1; jj < ej; jj++) {
for (int ii = si + 1; ii < ei; ii++) {
for (int k = 0; k < 4; k++) {
map[ii][jj][k] = -1;
}
}
}
}
queue<INFO> q;
q.push({ characterX * 2,characterY * 2,0});
visited[characterX * 2][characterY * 2] = 1;
while (!q.empty()) {
int mi = q.front().x;
int mj = q.front().y;
int count = q.front().count;
q.pop();
if (mi == itemX * 2 && mj == itemY * 2) {
answer = count / 2;
break;
}
for (int k = 0; k < 4; k++) {
int movei = mi + mv[k].x;
int movej = mj + mv[k].y;
if (!(movei >= 0 && movei <= 100 && movej >= 0 && movej <= 100)) continue;
if (map[movei][movej][k] == 1 && visited[movei][movej] == -1) {
visited[movei][movej] = 1;
q.push({ movei,movej,count + 1 });
}
}
}
return answer;
}
'프로그래머스' 카테고리의 다른 글
스타 수열 C++ (0) | 2022.02.11 |
---|---|
모두 0으로 만들기 C++ (0) | 2022.02.08 |
2 X n 타일링 C++ (0) | 2022.01.30 |
단어 변환 C++ (0) | 2022.01.29 |
경주로 건설 C++ (0) | 2022.01.29 |