본문 바로가기
알고리즘/백준 문제

[ALGORITHM] 백준 20056 - 마법사 상어와 파이어볼

by HDobby 2022. 12. 13.

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

 

20056번: 마법사 상어와 파이어볼

첫째 줄에 N, M, K가 주어진다. 둘째 줄부터 M개의 줄에 파이어볼의 정보가 한 줄에 하나씩 주어진다. 파이어볼의 정보는 다섯 정수 ri, ci, mi, si, di로 이루어져 있다. 서로 다른 두 파이어볼의 위치

www.acmicpc.net

주의할 점

  • m은 질량, s는 속도, d는 방향을 의미한다.
  • r과 c를 제대로 입력했는지 확인하자
  • 좌표가 1부터 시작하므로 0으로 시작하려면 1을 빼고 사용하자
  • 맵의 양 끝과 끝은 연결되어 있다 (가로든 세로든)
  • 질량의 합/5가 0이면 그 파이어볼은 사라진다
  • 파이어볼이 합쳐진 방향이 제대로 지정 되어 있는지 확인하자

코드

더보기
#include<iostream>
#include<vector>

using namespace std;

typedef struct Data{
    int m,s,d;
}dat;

int mv[8][2]={
    {0,-1},
    {1,-1},
    {1,0},
    {1,1},
    {0,1},
    {-1,1},
    {-1,0},
    {-1,-1},
};

int N,M,K;
vector<dat> maps[51][51];

void input(){
    int x,y,m,s,d;
    cin>>N>>M>>K;

    while(M--){
        cin>>y>>x>>m>>s>>d;
        --x;
        --y;
        
        maps[y][x].push_back({m,s,d});
    }
}

void chg_maps(vector<dat> tmps[51][51]){
    for(int i=0;i<N;++i){
        for(int j=0;j<N;++j){
            maps[i][j]=tmps[i][j];
        }
    }
}

void move(){
    vector<dat> tmps[51][51];

    for(int i=0;i<N;++i){
        for(int j=0;j<N;++j){
            for(int k=0;k<maps[i][j].size();++k){
                dat d = maps[i][j][k];
                int ny=(i+mv[d.d][1]*d.s+N*1000)%N;
                int nx=(j+mv[d.d][0]*d.s+N*1000)%N;

                tmps[ny][nx].push_back(d);
            }
        }
    }
    chg_maps(tmps);
}

void sumFire(){
    vector<dat> tmps[51][51];

    for(int i=0;i<N;++i){
        for(int j=0;j<N;++j){
            if(maps[i][j].size()>1){
                int sums=0, summ=0;
                int sumd=maps[i][j][0].d%2;
                for(int k=0;k<maps[i][j].size();++k){
                    dat d = maps[i][j][k];
                    if((sumd==0&&d.d%2==1)||(sumd==1&&d.d%2==0)){
                        sumd=2;
                    }

                    sums+=d.s;
                    summ+=d.m;
                }

                if(summ/5==0)
                    continue;

                
                for(int d=sumd==2?1:0, sz=maps[i][j].size();d<8;d+=2){
                    tmps[i][j].push_back({summ/5,sums/sz,d});
                }
            }
            else{
                tmps[i][j]=maps[i][j];
            }
        }
    }

    chg_maps(tmps);
}

void solution(){
    while(K--){
        move();
        sumFire();
    }

    int summ=0;
    
    for(int i=0;i<N;++i){
        for(int j=0;j<N;++j){
            for(int k=0;k<maps[i][j].size();++k){
                summ+=maps[i][j][k].m;
            }
        }
    }
    cout<<summ<<'\n';
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    input();
    solution();

    return 0;
}

728x90

댓글