티스토리 뷰

반응형

 

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
링크
«   2025/04   »
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
글 보관함