20058번 마법사 상어와 파이어스톰

동도리동·2021년 10월 19일
0

코딩테스트

목록 보기
69/76
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <tuple>
#include <math.h>
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
using namespace std;
int map[65][65];
int ch[65][65];
int n, q, nn;
void melt() {
	vector<pair<int, int> > V;
	for (int i = 1; i <= nn; i++) {
		for (int j = 1; j <= nn; j++) {
			if (map[i][j] == 0) continue;
			int tmp = 0;
			for (int k = 0; k < 4; k++) {
				int xx = i + dx[k];
				int yy = j + dy[k];
				if (xx > nn || xx <= 0 || yy > nn || yy <= 0) continue;
				if (map[xx][yy] == 0) continue;
				tmp++;
			}
			if (tmp < 3) V.push_back(make_pair(i, j));
		}
	}
	int size = V.size();
	for (int i = 0; i < size; i++) {
		map[V[i].first][V[i].second]--;
	}
}
void move(int a, int b, int len) {
	int boxcnt = len / 2;
	for (int k = 0; k < boxcnt; k++) {
		int start_x = a + k;
		int start_y = b + k;
		int end_x = a + len - k - 1;
		int end_y = b + len - k - 1;
		int idx_x = end_x;
		int idx_y = start_y;
		int tmp2 = 0;
		vector<int> tmp;
		for (int i = start_x; i < end_x; i++) tmp.push_back(map[i][start_y]);
		for (int i = start_x; i < end_x; i++) map[i][start_y] = map[end_x][idx_y++];
		for (int i = start_y; i < end_y; i++) map[end_x][i] = map[idx_x--][end_y];
		for (int i = end_x; i > start_x; i--) map[i][end_y] = map[start_x][idx_y--];
		for (int i = end_y; i > start_y; i--) map[start_x][i] = tmp[tmp2++];
	}
}
void go(int L) {
	int len = pow(2,L);
	for (int i = 1; i < nn; i += len) {
		for (int j = 1; j < nn; j += len) {
			move(i, j, len);
		}
	}
}
int main() {
	//freopen("in1.txt", "rt", stdin);
	cin >> n >> q;
	nn = pow(2, n);
	for (int i = 1; i <= nn; i++) {
		for (int j = 1; j <= nn; j++) {
			cin >> map[i][j];
		}
	}
	int L;
	for (int i = 0; i < q; i++) {
		cin >> L;
		if (L >= 1) go(L);
		melt();
	}
	int ans1 = 0;
	int ans2 = 0;
	for (int i = 1; i <= nn; i++) {
		for (int j = 1; j <= nn; j++) {
			if (map[i][j] == 0) continue;
			ch[i][j] = 1;
			ans1 += map[i][j];
			int sum = 1;
			queue<pair<int, int> > Q;
			Q.push(make_pair(i, j));
			while (!Q.empty()) {
				int x, y;
				tie(x, y) = Q.front(); Q.pop();
				for (int k = 0; k < 4; k++) {
					int xx = x + dx[k];
					int yy = y + dy[k];
					if (xx > nn || xx <= 0 || yy > nn || yy <= 0) continue;
					if (map[xx][yy] == 0) continue;
					if (ch[xx][yy] == 0) {
						Q.push(make_pair(xx, yy));
						ch[xx][yy] = 1;
						sum++;
						if(ans2==0||ans2<sum)ans2=sum;
						
					}
				}
			}
		}
	}
	cout << ans1 << '\n';
	cout << ans2 << '\n';
	return 0;
}
profile
긍정코딩세상

0개의 댓글

관련 채용 정보