작성
·
387
0
http://boj.kr/a56d875c729140559ebb3e3fadf75479
게시판, 문제 제공 테케 전부 돌려보고 제가 직접 생각해서
큰돌님께 배운대로
최소, 최대 이런 것들을 나름고려해서 테케를 짜서 돌려봤는데도 이상이 없어보였는데 1%에서 틀립니다... 혼자 최대한 해결해보려 했는데 한 문제를 2일 동안 붙잡으니 진도가 안나가서요...
질문이 많아 죄송합니다...ㅠㅠ
답변 2
0
0
안녕하세요 자르트님 ㅎㅎ
제가 이 코드 사실 여러번 디버깅을 해봤는데요..
잘 모르겠습니다..
잘 돌려지고 min_y, max_y 하신것도 괜찮습니다.
다만 걸리는 것은 ret을 해당 테스트케이스마다 최솟값으로 하는게 맞아서.
1 경우의 수 중 min > 1a
2 경우의 수 중 min > 2a
...
min(1a, 2a..) 를 출력하는 문제라 이 코드가 옳긴 옳은데요. (ret, ret2 분리)
#include<bits/stdc++.h>
using namespace std;
struct triple {
int r, c, s;
};
int min_y;
int max_y;
int min_x;
int max_x;
int dir;
int n, m, k, ret = 987654321, ret2 = 987654321;
vector<triple> v;
vector<int> idx;
int a[54][54];
int origin[54][54];
// 위 오른쪽 아래 왼쪽
int dy[] = { 0,1,0,-1 };
int dx[] = { 1,0,-1,0 };
vector<pair<int, int>> vv;
void print(int arr[54][54]) {
cout << '\n';
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << arr[i][j] << ' ';
}
cout << '\n';
}
}
void go(int y, int x) {
if (x == max_x && y == min_y)dir++;
if (x == min_x && y == max_y)dir++;
if (x == max_x && y == max_y)dir++;
int ny = y + dy[dir];
int nx = x + dx[dir];
if (!(min_y <= ny && ny <= max_y && min_x <= nx && nx <= max_x))return;
vv.push_back({ ny,nx });
go(ny, nx);
}
void _rotate() {
while (min_y != max_y) {
int startY = min_y;
int startX = min_x;
dir = 0;
vv.push_back({ startY,startX });
go(startY, startX);
vv.pop_back();
vector<int> b;
for (pair<int, int>p : vv)b.push_back(a[p.first][p.second]);
rotate(b.rbegin(), b.rbegin() + 1, b.rend());
int cnt = 0;
for (pair<int, int>p : vv)a[p.first][p.second] = b[cnt++];
vv.clear();
min_x++; max_x--; min_y++; max_y--;
}
for (int i = 0; i < n; i++) {
int sum = 0;
for (int j = 0; j < m; j++) {
sum += a[i][j];
}
ret = min(ret, sum);
}
}
int main() {
cin >> n >> m >> k;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)cin >> a[i][j];
}
memcpy(origin, a, sizeof(origin));
for (int i = 0; i < k; i++) {
triple t; cin >> t.r >> t.c >> t.s;
idx.push_back(i);
v.push_back(t);
}
do {
ret = 987654321;
for (int i = 0; i < v.size(); i++) {
min_y = v[idx[i]].r - v[idx[i]].s - 1;
max_y = v[idx[i]].r + v[idx[i]].s - 1;
min_x = v[idx[i]].c - v[idx[i]].s - 1;
max_x = v[idx[i]].c + v[idx[i]].s - 1;
_rotate();
}
ret2 = min(ret2, ret);
print(a);
memcpy(a, origin, sizeof(a));
} while (next_permutation(idx.begin(), idx.end()));
cout << ret2 << '\n';
}
이것도 틀렸다고 나오네요..
도움이 못되어서 죄송합니다.
감사합니다.