[백준] 21610 마법사 상어와 비바라기

김정환·2022년 4월 6일
0

너무 오랜만에 풀어보는 ..

문제 바로가기

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

struct node {
	int y, x;
};
int n, m, d, s;
vector<node> cloud;
vector<int> info[101];
vector<int> map[51];
bool chkOldCloud[51][51];
int dy[8] = { 0,-1,-1,-1,0,1,1,1 }; //서쪽부터 대각포함 시계방향
int dx[8] = { -1,-1,0,1,1,1,0,-1 };
int bugDirY[4] = { -1,1,1,-1 };
int budDirX[4] = { 1,1,-1,-1 };
void printMap();
void move(int d, int s);
void initCloud();
void printCloud();
void rain();
void waterCopyBug();
void makeCloud();
void initChkOldCloud();
int getResult();

int main() {
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			int tmp;
			cin >> tmp;
			map[i].push_back(tmp);
		}
	}
	for (int i = 0; i < m; i++) {
		cin >> d >> s;
		info[i].push_back(d-1);
		info[i].push_back(s);
	}

	initCloud();
	//printCloud();
	for (int i = 0; i < m; i++) {
		initChkOldCloud(); //구름 존재했는지 체크 map 초기화
		move(info[i][0], info[i][1]);
		rain(); //비내리고 구름있던 부분 체크
		//printMap();
		waterCopyBug(); //물복사 하고 현재 위치 구름 없애기
		makeCloud();
	}

	int result = getResult();
	cout << result;
}

void rain() {
	for (int i = 0; i < cloud.size(); i++) {
		map[cloud[i].y][cloud[i].x] += 1;
		chkOldCloud[cloud[i].y][cloud[i].x] = true;
	}
}

void initCloud() {
	cloud.push_back({ n - 1, 0 });
	cloud.push_back({ n - 1,1 });
	cloud.push_back({ n - 2,0 });
	cloud.push_back({ n - 2,1 });
}

void printCloud() {
	cout << "where clouds? num: " << cloud.size() << '\n';
	for (int i = 0; i < cloud.size(); i++) {
		cout << cloud[i].y << ',' << cloud[i].x << '\n';
	}
}

void move(int d, int s) {
	//cout << "==after move==\n";
	int cSize = cloud.size();
	for (int i = cSize-1; i >= 0; i--) {
		int nx = cloud[i].x;
		int ny = cloud[i].y;
		//cout << "cloud: " << ny << ',' << nx << '\n';

		for (int j = 1; j <= s; j++) {
			nx += dx[d];
			ny += dy[d];
			if (nx < 0) {
				nx = n - 1;
			}
			if (ny < 0) {
				ny = n - 1;
			}
			if (nx >= n) {
				nx = 0;
			}
			if (ny >= n) {
				ny = 0;
			}
		}
		cloud[i].x = nx;
		cloud[i].y = ny;
	}
	//printCloud();
}

void printMap() {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cout << map[i][j] << ' ';
		}
		cout << '\n';
	}
}

//이동된 구름에서 비와서 +1 되었고, 물복사버그 시전하면서 구름없애버리자
void waterCopyBug() {
	//cout << "===waterCopyBug===\n";
	for (int i = 0; i<cloud.size(); i++) {
		int x = cloud[i].x;
		int y = cloud[i].y;
		//cout << "cloud: (" << y << ',' << x << ")\n";
		int waterCnt = 0;
		for (int j = 0; j < 4; j++) {
			int nx = x + budDirX[j];
			int ny = y + bugDirY[j];
			if (ny < 0 || nx < 0 || ny >= n || nx >= n) continue;
			if (!map[ny][nx]) continue;
			waterCnt++;
		}
		//cout << "waterCnt: " << waterCnt << "\n";
		map[y][x] += waterCnt;
	}
	//printMap();
	cloud.clear();
}

void makeCloud() {
	//cout << "===makeCloud===\n";
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (chkOldCloud[i][j]) continue; //이전에 구름이였던 자리면 생기면 안됌
			if (map[i][j] < 2) continue;
			map[i][j] -= 2;
			cloud.push_back({ i,j });
		}
	}
	//printCloud();
	//printMap();
}

void initChkOldCloud() {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			chkOldCloud[i][j] = false;
		}
	}
}

int getResult() {
	int res = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (!map[i][j]) continue;
			res += map[i][j];
		}
	}
	return res;
}

profile
지금부터라도 열심히 해보자

0개의 댓글