5-O
486
60 asked
http://boj.kr/a56d875c729140559ebb3e3fadf75479
게시판, 문제 제공 테케 전부 돌려보고 제가 직접 생각해서
큰돌님께 배운대로
최소, 최대 이런 것들을 나름고려해서 테케를 짜서 돌려봤는데도 이상이 없어보였는데 1%에서 틀립니다... 혼자 최대한 해결해보려 했는데 한 문제를 2일 동안 붙잡으니 진도가 안나가서요...
질문이 많아 죄송합니다...ㅠㅠ
Answer 2
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';
}
이것도 틀렸다고 나오네요..
도움이 못되어서 죄송합니다.
감사합니다.
코살구 로그인 문제
0
10
1
3-A 문제 풀이 관련 질문
0
32
2
2-O 질문 있습니다
0
30
2
2-T 문제에 관한 질문
0
29
2
코딩 살구 클럽 접속 및 사용방법 문의
0
44
2
안녕하세요~. 현재 코살코딩클럽 사이트가 접속이 안됩니다~
0
59
2
코딩살구클럽 로그인문제
0
61
3
코딩 살구 클럽 로그인 문제
0
68
2
2-J 채점관련 질문
0
62
3
코딩 살구 클럽 Python 지원 가능 여부
0
72
1
살구클럽 아이디 없음 문제
0
73
1
1-O 코딩살구클럽 채점관련 질문
0
55
2
히든 테스트 케이스가 사라졌습니다
0
53
1
채점서버 혹시 다른 언어 지원도 가능하게 해주실 수 있나요
1
71
2
살구 클럽 채점 관련 문의(테스트 케이스)
0
65
2
1-H 문제 채점하기 오류
0
57
3
코딩살구클럽 2주차 2-L 문제 채점하기 오류
0
51
2
살구 클럽 채점 관련 문의
0
61
2
코딩 살구 클럽 실전 세션
0
56
2
코딩살구클럽 채점 관련 질문
0
49
2
코딩살구클럽 컴파일에러
0
78
2
5-B
0
49
2
4 - A
0
57
2
코딩살구클럽 입장이 안됩니다
0
147
2

