티스토리 뷰
반응형
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;
}
반응형
'알고리즘 공부 > 문제풀이' 카테고리의 다른 글
백준 2031번 - 이 쿠키 달지 않아! (0) | 2021.05.02 |
---|---|
백준 14923번 - 미로 탈출 (0) | 2021.05.01 |
백준 21611번 - 마법사 상어와 블리자드 (0) | 2021.04.30 |
백준 21608번 - 상어 초등학교 (0) | 2021.04.29 |
백준 21609번 - 상어 중학교 (0) | 2021.04.29 |