-
[백준 17406] 배열 돌리기4C 프로그래밍/BOJ 2022. 12. 11. 13:50728x90
https://www.acmicpc.net/problem/17406
#include <cstdio> #include <cstring> int R, C, K; int board[100 + 2][100 + 2]; int ans = 0x7fffffff; struct _st { int r, c, s; }; _st CMD[6 + 2]; int flag[6 + 2]; int choice[6 + 2]; int bak_board[100 + 2][100 + 2]; int tmp[100 + 2][100 + 2]; void input() { scanf("%d %d %d", &R, &C, &K); for (int r = 1; r <= R; r++) { for (int c = 1; c <= C; c++) { scanf("%d", &board[r][c]); } } for (int i = 0; i < K; i++) { scanf("%d %d %d", &CMD[i].r, &CMD[i].c, &CMD[i].s); } } int rotate() { // backup memcpy(bak_board, board, sizeof(board)); // init memcpy(tmp, board, sizeof(tmp)); for (int i = 0; i < K; i++) { int r = CMD[choice[i]].r; int c = CMD[choice[i]].c; int s = CMD[choice[i]].s; int sr = r - s; int sc = c - s; int er = r + s; int ec = c + s; while (1) { if (sr == er && sc == ec) break; for (int j = sc; j < ec; j++) tmp[sr][j + 1] = board[sr][j]; for (int i = sr; i < er; i++) tmp[i + 1][ec] = board[i][ec]; for (int j = ec; j > sc ; j--) tmp[er][j - 1] = board[er][j]; for (int i = er; i > sr; i--) tmp[i - 1][sc] = board[i][sc]; sr++; sc++; er--; ec--; } memcpy(board, tmp, sizeof(tmp)); } // calculate int min_val = 0x7fffffff; for (int r = 1; r <= R; r++) { int sum = 0; for (int c = 1; c <= C; c++) { sum += board[r][c]; } if (min_val > sum) min_val = sum; } // undo memcpy(board, bak_board, sizeof(board)); return min_val; } void DFS(int n) // permutation { if (n == K) { int res = rotate(); if (res < ans) ans = res; return; } for (int i = 0; i < K; i++) { if (flag[i]) continue; flag[i] = 1; choice[n] = i; DFS(n + 1); flag[i] = 0; } } int main() { input(); DFS(0); printf("%d\n", ans); return 0; }
한달 전에 푼 기억이 없는데 언제풀었지 ..
암튼 가장 중요했던 것은 sr == er && sc == ec 일 때 while 문 멈춰주는 것
728x90'C 프로그래밍 > BOJ' 카테고리의 다른 글
[백준 16920] 확장 게임 (0) 2022.12.08 [백준 6593] 상범 빌딩 (0) 2022.12.07 [백준 22255] 호석사우루스 (0) 2022.12.06 [백준 8972] 미친 아두이노 (0) 2022.12.06 [백준 1261] 알고스팟 (0) 2022.12.06