Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

찌로그

[BOJ] 백준 17822번 문제 원판 돌리기 2020_05_19 C++ 본문

Coding

[BOJ] 백준 17822번 문제 원판 돌리기 2020_05_19 C++

찌드 2020. 5. 19. 23:45

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

 

17822번: 원판 돌리기

반지름이 1, 2, ..., N인 원판이 크기가 작아지는 순으로 바닥에 놓여있고, 원판의 중심은 모두 같다. 원판의 반지름이 i이면, 그 원판을 i번째 원판이라고 한다. 각각의 원판에는 M개의 정수가 적혀

www.acmicpc.net

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
#include <bits/stdc++.h>
 
using namespace std;
typedef pair<intint> p;
int maps[51][51];
int n,m,t; // n circles, m numbers per circle
void rotate(int i, int d, int k){
    if(d == 0){ // clock wise >>>
        for(int x=0; x<k; x++){
            int temp = maps[i][m];
            for(int j=m; j>1; j--){
                maps[i][j] = maps[i][j-1];
            }
            maps[i][1= temp;
        }
    }
    else{// counter clock wise <<<<
        for(int x=0; x<k; x++){
            int temp = maps[i][1];
            for(int j=1; j<m; j++){
                maps[i][j] = maps[i][j+1];
            }
            maps[i][m] = temp;
        }
    }
}
 
void calc(){
    vector<p> suc;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            if(maps[i][j] == 0 ) continue;
            if(maps[i][j] == maps[i][j-1&& j>1){
                suc.push_back({i,j});
                suc.push_back({i,j-1});
            }
            if(maps[i][j] == maps[i][j+1&& j<n){
                suc.push_back({i,j});
                suc.push_back({i,j+1});
            }
            if(maps[i][j] == maps[i-1][j] && i>1){
                suc.push_back({i,j});
                suc.push_back({i-1,j});
            }
            if(maps[i][j] == maps[i+1][j] && i<n){
                suc.push_back({i,j});
                suc.push_back({i+1,j});
            }
        }
        if(maps[i][1== maps[i][m] && maps[i][1!= 0){
            suc.push_back({i,1});
            suc.push_back({i,m});
        }
    }
    // cout << "**** : " << suc.size() <<endl;
    if(suc.empty()){// average and calc
        int total=0, num =0;
        vector<p> non;
        for(int i=1; i<=n; i++){
            for(int j=1; j<=m; j++){
                if(maps[i][j] !=0){
                    non.push_back({i,j});
                    total += maps[i][j];
                    num++;
                }
            }
        }
        float avg = (float)total / (float)num;
        //cout << "********* : " <<  avg <<endl;
        for(auto a : non){
            if(maps[a.first][a.second] < avg)
                maps[a.first][a.second]++;
            else if(maps[a.first][a.second] > avg)
                maps[a.first][a.second]--;
        }
    }else{
        for(auto a : suc){
            maps[a.first][a.second] = 0;
        }
    }
}
int sum(){
    int ret=0;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            ret += maps[i][j];
        }
    }
    return ret;
}
void pr(){
    cout << "------------" <<endl;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            cout << maps[i][j] << " ";
        }
        cout <<endl;
    }
    cout<< "------------" <<endl;
}
int main(){
 
    scanf("%d %d %d"&n, &m, &t);
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            scanf("%d"&maps[i][j]);
        }
    }
    for(int i=0; i<t; i++){
        int x, d, k;
        scanf("%d %d %d"&x, &d, &k);
        for(int a=1; a<=n; a++if(a%x ==0) rotate(a,d,k);
        //pr();
        calc();
        //pr();
 
    }
    printf("%d\n", sum());
    return 0;
}
 
cs
Comments