본문 바로가기
CS/알고리즘

백준 17822 원판 돌리기(시뮬)

by zieunee 2020. 5. 6.
반응형

https://www.acmicpc.net/problem/17822

 

17822번: 원판 돌리기

반지름이 1, 2, ..., N인 원판이 크기가 작아지는 순으로 바닥에 놓여있고, 원판의 중심은 모두 같다. 원판의 반지름이 i이면, 그 원판을 i번째 원판이라고 한다. 각각의 원판에는 M개의 정수가 적혀있고, i번째 원판에 적힌 j번째 수의 위치는 (i, j)로 표현한다. 수의 위치는 다음을 만족한다. (i, 1)은 (i, 2), (i, M)과 인접하다. (i, M)은 (i, M-1), (i, 1)과 인접하다. (i, j)는 (i, j-1), (i, j

www.acmicpc.net

 톱니바퀴 문제랑 비슷

생각보다 빨리풀었다

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<vector>
#include<string.h>
using namespace std;
int N, M, T;
int map[52][52];
int visited[52][52];
vector <int> X,D,K;
int x, d, k;
int res;
int dy[4] = { 1,0,-1,0 };
int dx[4] = { 0,-1,0,1 };
bool flag;
bool flagOne;
int allVal, cnt;
void rotate(int x,int d,int k) {
	int temp;
	if (d == 0) { //시계
		for (int j = 0; j < k; j++) {
			temp = map[x][M];
			for (int i = M; i > 1; i--) {
				map[x][i] = map[x][i - 1];
			}
			map[x][1] = temp;
		}		
	}
	else if (d == 1) { //반시계
		for (int j = 0; j < k; j++) {
			temp = map[x][1];
			for (int i = 1; i < M; i++) {
				map[x][i] = map[x][i + 1];
			}
			map[x][M] = temp;
		}

	}
}
void nearby(int cx, int cy, int val ,int cnt) {
	if (cnt >= 2) {
		map[cx][cy] = 0;
		flag = true;
	}
	for (int i = 0; i < 4; i++){
		int nx = cx + dx[i];
		int ny = cy + dy[i];

		 if (ny <= 0) ny = M;
		 else if(ny > M) ny = 1;

		if (visited[nx][ny] == 0 && map[nx][ny] == val && map[nx][ny] != 0 && nx > 0 && ny > 0 && nx <= N && ny <= M) {
			visited[nx][ny] = 1;
			nearby(nx, ny, val, cnt + 1);
		}
	}

}
int main() {
	scanf("%d%d%d", &N, &M, &T);

	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= M; j++) {
			scanf("%d", &map[i][j]);
		}
	}

	
	for (int a = 0; a < T; a++) {
		scanf("%d%d%d", &x,&d,&k);
		
		int tm = N / x;
		
		for (int t = 1; t <= tm; t++) {
			rotate(x*t,d,k);
		}

		memset(visited,0,sizeof(visited));

		flagOne = false;
		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= M; j++) {
				flag = false;
				visited[i][j] = 1;
				nearby(i, j, map[i][j], 1);
				if (flag) {
					map[i][j] = 0;
					flagOne = true;
				}
			}
		}

		if (!flagOne) {
			cnt = 0;
			allVal = 0;
 			for (int i = 1; i <= N; i++) {
				for (int j = 1; j <= M; j++) {
					if (map[i][j] != 0) {
						allVal += map[i][j];
						cnt++;
					}
				}
			}
		
			double avg = (double)allVal / (double)cnt;
			for (int i = 1; i <= N; i++) {
				for (int j = 1; j <= M; j++) {
					if (map[i][j] != 0 && map[i][j] < avg) {
						map[i][j]++;
					}
					else if(map[i][j] != 0 && map[i][j] > avg) {
						map[i][j]--;
					}
				}
			}
		}


	}
	////////////////////////////////
	res = 0;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= M; j++) {
			res += map[i][j];
		}
	}

	printf("%d", res);
}
반응형