알고리즘/programmers
프로그래머스 - 행렬 테두리 회전하기
by 유이얼
2021. 10. 9.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<vector<int>> board;
int c;
int dx[] = {1,0,-1,0};
int dy[] = {0,1,0,-1};
int r(vector<int> q) {
int dir = 0;
int sy = q[0] - 1;
int sx = q[1] - 1;
int ey = q[2] - 1;
int ex = q[3] - 1;
int cy = sy + dy[dir];
int cx = sx + dx[dir];
int t = board[sy][sx];
int ans = c;
while (1) {
ans = min(ans, t);
swap(t, board[cy][cx]);
if (cy == sy && cx == sx) {
break;
}
if (cx == ex && cy == sy ||
cx == ex && cy == ey ||
cx == sx && cy == ey)
++dir;
cy += dy[dir];
cx += dx[dir];
}
return ans;
}
int f(vector<int> &q) {
int y1 = q[0] - 1;
int x1 = q[1] - 1;
int y2 = q[2] - 1;
int x2 = q[3] - 1;
int ans = c;
int t = board[y1][x1];
for (int i = x1; i < x2; ++i) {
int t2 = board[y1][i+1];
board[y1][i+1] = t;
ans = min(ans, t);
t = t2;
}
for (int i = y1; i < y2; ++i) {
int t2 = board[i+1][x2];
board[i+1][x2] = t;
ans = min(ans, t);
t = t2;
}
for (int i = x2; i > x1; --i) {
int t2 = board[y2][i-1];
board[y2][i-1] = t;
ans = min(ans, t);
t = t2;
}
for (int i = y2; i > y1; --i) {
int t2 = board[i-1][x1];
board[i-1][x1] = t;
ans = min(ans, t);
t = t2;
}
return ans;
}
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
board.resize(rows, vector<int>(columns));
c = 0;
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < columns; ++j)
board[i][j] = ++c;
}
vector<int> answer;
for (auto q : queries) {
answer.push_back(r(q));
}
return answer;
}