2021.10.01_21610-마법사상어와비바라기
본문 바로가기
알고리즘 모음집/New 알고리즘

2021.10.01_21610-마법사상어와비바라기

by KyeongMin 2021. 10. 1.
728x90
반응형

소스코드

#include<stdio.h>
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
#define SIZE 51
struct Data {
	int y, x;
};
int N, M;
int A[SIZE][SIZE];
int answer;
int dy[] = {0,0,-1,-1,-1,0,1,1,1 };
int dx[] = {0, -1,-1,0,1,1,1,0,-1 };
void init();//초기화 및 입력
void magic();//마법의 시작
bool safeZone(int y, int x);//
int moveCloud();//구름 이동
int makeCloud();//구름 생성
int main(void) {
	int testCase = 1;
	for (int tc = 1; tc <= testCase; tc++) {
		init();
		magic();
		printf("%d\n", answer);
	}

	return 0;
}

void init() {
	N = M = answer = 0;
	memset(A, 0, sizeof(A));
	scanf("%d %d", &N, &M);
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			scanf("%d", &A[i][j]);
		}
	}
}
bool safeZone(int y, int x) {
	return 1 <= y && y <= N && 1 <= x && x <= N;
}
void magic() {
	vector<Data>cloud;
	cloud.push_back({ N,1 });
	cloud.push_back({ N,2 });
	cloud.push_back({ N - 1,1 });
	cloud.push_back({ N - 1,2 });
	for (int m = 0; m < M; m++) {
		int cloudA[SIZE][SIZE] = { 0, };
		int dir, cnt;
		scanf("%d %d", &dir, &cnt);
		for (int c = 0; c < cnt; c++) {
			for (int i = 0; i < cloud.size(); i++) {//이동
				cloud[i].y += dy[dir];
				cloud[i].x += dx[dir];
				if (cloud[i].y == 0)cloud[i].y = N;
				if (cloud[i].y == N + 1)cloud[i].y = 1;
				if (cloud[i].x == 0)cloud[i].x = N;
				if (cloud[i].x == N + 1)cloud[i].x = 1;
			}// for int i 
		}// for int c
		for (int i = 0; i < cloud.size(); i++) {//비내림
			A[cloud[i].y][cloud[i].x]++;
			cloudA[cloud[i].y][cloud[i].x] = 1;//이전 구름 체크
		}
		for (int i = 0; i < cloud.size(); i++) {//주변 대각선 체크
			for (int dir = 2; dir <= 8; dir += 2) {
				int ny = cloud[i].y + dy[dir];
				int nx = cloud[i].x + dx[dir];
				if (safeZone(ny, nx)&&A[ny][nx]!=0) {
					cloudA[cloud[i].y][cloud[i].x]++;
				}
			}
		}
		for (int i = 0; i < cloud.size(); i++) {
			A[cloud[i].y][cloud[i].x] += cloudA[cloud[i].y][cloud[i].x] - 1;
		}
		// 구름 생성
		cloud.clear();
		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= N; j++) {
				if (cloudA[i][j] == 0&&A[i][j]>=2) {
					A[i][j] -= 2;
					cloud.push_back({ i,j });
				}
			}
		}

	}//for int m
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			answer += A[i][j];
		}
	}
}

설계

실수

  • 0부터 dir이 시작이 아니고 1부터 시작인것 이부분을 실수
  • 진짜 이문제는 시뮬에서도 수준이 낮은것 같다
  • 진짜 구현하는대로만 하면 어렵지 않게 구현이 가능하다.

문제 링크

21610-마법사상어와비바라기

원본

https://github.com/3DPIT/AlgorithmFinal/blob/main/02.algorithmStudy/1001/01.21610-%EB%A7%88%EB%B2%95%EC%82%AC%EC%83%81%EC%96%B4%EC%99%80%EB%B9%84%EB%B0%94%EB%9D%BC%EA%B8%B0/2021.10.01_21610-%EB%A7%88%EB%B2%95%EC%82%AC%EC%83%81%EC%96%B4%EC%99%80%EB%B9%84%EB%B0%94%EB%9D%BC%EA%B8%B0.md

 

GitHub - 3DPIT/AlgorithmFinal

Contribute to 3DPIT/AlgorithmFinal development by creating an account on GitHub.

github.com

 

728x90
반응형

댓글