티스토리 뷰

반응형

 

www.acmicpc.net/problem/21610

 

21610번: 마법사 상어와 비바라기

마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기

www.acmicpc.net

백준 21608번 - 상어 초등학교 문제와 비슷한 난이도의 단순 구현 문제였습니다.

시뮬레이션 과정1,2,3을 move 함수, 4를 copyWater 함수 그리고 과정5를 makeCloud함수에 담았습니다.

 

  • c++ 전체 코드
#include<bits/stdc++.h>
#define xx first
#define yy second
using namespace std;
typedef pair<int,int> pii;

int N,M;
int m[51][51]{};
vector<pii> cl;
vector<pii> bug;
bool vi[51][51]{};
int dy[8] = {0,-1,-1,-1,0,1,1,1};
int dx[8] = {-1,-1,0,1,1,1,0,-1};

void makeCloud(){
    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++){
            if(m[i][j]>=2 && !vi[i][j]) {
                cl.push_back({i,j});
                m[i][j] -= 2;
            }
        }
    }
}

int da[4] = {-1,-1,1,1};
int db[4] = {-1,1,1,-1};
void copyWater(){
    vector<int> t;
    for(auto pos : bug){
        int ca = pos.xx;
        int cb = pos.yy;
        int cnt = 0;
        for(int i=0; i<4; i++){
            int na = ca + da[i];
            int nb = cb + db[i];
            if(na<0 || nb<0 || na>=N || nb>=N) continue;
            if(m[na][nb]) cnt++;
        }
        t.push_back(cnt);
    }
    for(int i=0; i<bug.size(); i++) {
        m[bug[i].xx][bug[i].yy] += t[i];
    }
}

void move(int d, int s){
    memset(vi,0,sizeof(vi));
    bug.clear();
    for(auto pos : cl){
    	// 음수값이 안나오도록 큰값(50*N)을 더해줌
        int ny = (50*N + pos.xx + s*dy[d])%N;
        int nx = (50*N + pos.yy + s*dx[d])%N;
        m[ny][nx]++;
        vi[ny][nx] = true;
        bug.push_back({ny,nx});
    }
    cl.clear();
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin>>N>>M;
    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++){
            cin>>m[i][j];
        }
    }
    cl.push_back({N-1,0});
    cl.push_back({N-1,1});
    cl.push_back({N-2,0});
    cl.push_back({N-2,1});
    int d,s; // 방향, 거리
    for(int i=0; i<M; i++) {
        cin>>d>>s; d--;
        move(d,s);
        copyWater();
        makeCloud();
    }
    
    int sum=0;
    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++){
            sum += m[i][j];
        }
    }
    cout<<sum;
}
반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   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
글 보관함