찌로그
[BOJ] 백준 17822번 문제 원판 돌리기 2020_05_19 C++ 본문
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<int, int> 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 |
'Coding' 카테고리의 다른 글
[BOJ] 백준 15683번 감시 2020_05_26 C++ (0) | 2020.05.26 |
---|---|
[BOJ] 백준 14891번 톱니바퀴 2020_05_22 C++ (0) | 2020.05.22 |
[BOJ] 백준 14890번 경사로 2020_05_22 C++ (0) | 2020.05.22 |
[BOJ] 백준 17825번 주사위 윷놀이 2020_05_21 C++ (0) | 2020.05.21 |
[BOJ] 백준 15684번 문제 사다리 조작 2020_05_19 C++ (0) | 2020.05.19 |
Comments