제민

17822 원판 돌리기 본문

코테연습일지/구현 (시뮬레이션)

17822 원판 돌리기

jemin0619 2024. 3. 7. 00:31

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

 

17822번: 원판 돌리기

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

www.acmicpc.net

 

사실 구현은 진작에 마쳤는데 double형 변환 이슈로 고생했다. 

그리고 빈 값을 0x7f777777으로 했는데 -1로 하는게 낫지 않았을까?? 

그리고 빈 값을 0으로 하면 문제가 생길까?

생각할 거리가 좀 많았다.

다른 구현 문제들보다 쉬웠던 느낌이 든다.

덱으로 구현했는데 배열 rotate가 더 쉬웠을 수도 있겠다.

 

#include <bits/stdc++.h>
using namespace std;

int n,m,t;
deque<int> deq[52];
int dy[4]={1,0,-1,0};
int dx[4]={0,1,0,-1};
queue<pair<int,int>> Q; //0으로 만들 값 좌표 저장함
int deletedCnt=0;

void printtest(){
    for(int i=1;i<=n;i++){
        for(int j=0;j<m;j++){
            cout<<deq[i][j]<<' ';
        } cout<<'\n';
    } cout<<'\n';
}

int getSum(){
    int ret=0;
    for(int i=1;i<=n;i++)
        for(int j=0;j<m;j++)
            if(deq[i][j]!=0x7f777777) ret+=deq[i][j];
    return ret;
}

void CLW(int idx){
    int val=deq[idx].back();
    deq[idx].pop_back();
    deq[idx].push_front(val);
}

void CCW(int idx){
    int val=deq[idx].front();
    deq[idx].pop_front();
    deq[idx].push_back(val);
}

void deleteSurroundArea(){
    bool deleted=false;
    for(int depth=1;depth<=n;depth++){
        for(int i=0;i<m;i++){
            int cur=i; int nxt=i+1; if(nxt==m) nxt=0;
            if(deq[depth][cur]==0x7f777777) continue;
            if(deq[depth][cur]==deq[depth][nxt]){Q.push({depth,cur}); Q.push({depth,nxt});}
            if(depth!=n){if(deq[depth][cur]==deq[depth+1][cur]){Q.push({depth,cur}); Q.push({depth+1,cur});}}
        }
    } 
    while(!Q.empty()){
        auto cur=Q.front(); Q.pop();
        deq[cur.first][cur.second]=0x7f777777;
        deleted=true;
    }
    int mod=0;
    for(int i=1;i<=n;i++)
        for(int j=0;j<m;j++)
            if(deq[i][j]!=0x7f777777) mod++;

    if(!deleted){
        double standard=((double)getSum()/mod);
        for(int i=1;i<=n;i++){
            for(int j=0;j<m;j++){
                if(deq[i][j]==0x7f777777) continue;
                if((double)deq[i][j]>standard) deq[i][j]--;
                else if((double)deq[i][j]<standard) deq[i][j]++;
            }
        }
    }
}

int main(){
    ios::sync_with_stdio(0); cin.tie(0);
    cin>>n>>m>>t;
    for(int i=1;i<=n;i++){
        for(int j=0;j<m;j++){
            int val; cin>>val;
            deq[i].push_back(val);
        }
    }
    while(t--){
        int x,d,k; cin>>x>>d>>k;
        for(int i=x;i<=n;i+=x){
            if(d==0) {for(int rot=0;rot<k;rot++){ CLW(i);}} //시계방향 회전
            if(d==1) {for(int rot=0;rot<k;rot++){ CCW(i);}} //반시계 회전
        }
        deleteSurroundArea();
    }
    cout<<getSum();
    return 0;
}

'코테연습일지 > 구현 (시뮬레이션)' 카테고리의 다른 글

15685 드래곤 커브  (4) 2024.03.07
20055 컨베이어 벨트 위의 로봇  (0) 2024.03.06
17406 배열 돌리기 4  (4) 2024.03.05
17825 주사위 윷놀이  (0) 2024.03.04
19235 모노미노도미노  (0) 2024.03.03