본문 바로가기

BOJ/C++

[BOJ] 배열 돌리기4

[문제]

https://www.acmicpc.net/problem/17406

 

17406번: 배열 돌리기 4

크기가 N×M 크기인 배열 A가 있을때, 배열 A의 값은 각 행에 있는 모든 수의 합 중 최솟값을 의미한다. 배열 A가 아래와 같은 경우 1행의 합은 6, 2행의 합은 4, 3행의 합은 15이다. 따라서, 배열 A의 값은 4이다. 1 2 3 2 1 1 4 5 6 배열은 회전 연산을 수행할 수 있다. 회전 연산은 세 정수 (r, c, s)로 이루어져 있고, 가장 왼쪽 윗 칸이 (r-s, c-s), 가장 오른쪽 아랫 칸이 (r+s, c+s)인 정사각형을 시계

www.acmicpc.net

[풀이]

17406 맞았습니다!! 2008 8 C++14 / 수정 2425 43초 전

 

0) 조합 + 단순 반복?

 

1) next_permutation을 사용해서 연산 순서 조합을 구한 후에 배열을 회전시킨다. 

 

2) 회전이 끝나면 각 행의 값을 구한다.

 

3) 최소값을 구한다. 

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <iostream>
#include <vector>
#include <cmath>
#include <cstring>
#include <algorithm>
 
using namespace std;
 
//풀이 시간 : 40분 
int n, m, k, map[51][51], ans = 987654321;
 
typedef pair<intint> pp;
typedef pair<pp, int> ppp;
 
vector<ppp> op;
vector<int> seq;
 
bool visited[7];
 
void printMap() {
     cout << '\n';
     for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            cout << map[i][j] << " ";
        }
        cout << '\n';
    }
     cout << '\n';
}
int rotateArray() {
    for (int z = 0; z < k; ++z) {
        //연산 수대로 진행 
        int r = op[seq[z]].first.first;
        int c = op[seq[z]].first.second;
        int s = op[seq[z]].second;
 
        int cycle = s;
 
        while (cycle > 0) {
            int tmp = map[r - cycle][c - cycle];
 
            //->
            for (int i = c - cycle + 1; i <= c + cycle; i++) {
                int tmp2 = map[r - cycle][i];
                map[r - cycle][i] = tmp;
                tmp = tmp2;
            }
 
            //V
            for (int i = r - cycle + 1; i <= r + cycle; i++ ) {
                int tmp2 = map[i][c + cycle];
                map[i][c+cycle] = tmp;
                tmp = tmp2;
 
            }
 
            //<-
            for (int i = c + cycle-1; i >= c-cycle; i--) {
                int tmp2 = map[r + cycle][i];
                map[r+cycle][i] = tmp;
                tmp = tmp2; 
            }
 
            //^
            for(int i = r + cycle-1; i >= r-cycle; i--) {
                int tmp2 = map[i][c-cycle];
                map[i][c-cycle] = tmp;
                tmp = tmp2;
 
            }
            cycle--;
        }
        // printMap();
    }
    int res = 987654321, sum = 0;
    for (int i = 1; i <= n; ++i) {
        sum = 0;
        for (int j = 1; j <= m; ++j) {
            sum += map[i][j];
        }      
        res = min(sum, res);
 
    }
    return res;
 
}
// void dfs(int cnt, int cur) {
//     if (cnt == op.size()) {
       
//         for (int i = 0; i < seq.size(); i++) {
//             cout << seq[i] << '\n';
//         }
//         int res = rotateArray();
//         ans = min(res, ans);
 
//         return;
//     }
//     visited[cur] = true;
//     seq.push_back(cur);
//     dfs(cnt+1, cur+1 );
//     visited[cur] = false;
//     seq.pop_back();
 
//     // for (int i = cur; i < op.size(); ++i) {
//     //     if (!visited[i]) {
//     //         visited[i] = true;
//     //         seq.push_back(i);
//     //         dfs(cnt+1, cur+1);
//     //         seq.pop_back();
//     //         visited[i] = false;
//     //     }
//     // }
// }
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    cin >> n >> m >> k;
 
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            cin >> map[i][j];
        }
    }
 
    for (int i = 0; i < k; ++i) {
        int a, b, c;
 
        cin >> a >> b >> c;
 
        op.push_back(ppp(pp(a, b), c));
        seq.push_back(i);
 
    }
    //input 
 
    // dfs(0,0);
    //연산 순서를 정한다. 
 
    do {
        int c_map[51][51];
 
        memcpy(c_map, map, sizeof(map));
 
        ans = min(ans, rotateArray());
 
        memcpy(map, c_map, sizeof(map));
 
    } while(next_permutation(seq.begin(), seq.end()));
 
    cout << ans << '\n';
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

'BOJ > C++' 카테고리의 다른 글

[BOJ] 색종이 붙이기  (0) 2019.09.06
[BOJ] 사다리조작  (0) 2019.08.28
[BOJ] 안전영역  (0) 2019.08.16
[BOJ] 분수의 합  (0) 2019.08.09
[BOJ] 플로이드  (0) 2019.08.09