14502 연구소(리팩토링)
본문 바로가기
알고리즘 모음집/New 알고리즘

14502 연구소(리팩토링)

by KyeongMin 2021. 3. 19.
728x90
반응형

www.acmicpc.net/problem/14502

 

14502번: 연구소

인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크

www.acmicpc.net

#include<stdio.h>
#include<iostream>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
#define MAP_MAX_SIZE 9
#define INSTALL_WALL 1
#define UNINSTALL_WALL 0
#define VIRUS 2
int N, M;//가로 세로의 크기 입력 변수
int map_arr[MAP_MAX_SIZE][MAP_MAX_SIZE];//입력으로 주어지는 맵 정보
int safeZone_Max;//결과 값
int directY[] = { 0,1,0,-1 };
int directX[] = { 1,0,-1,0 };
int visitChk[MAP_MAX_SIZE][MAP_MAX_SIZE] = { 0, };//방문체크 배열
struct virusData {int y, x;};
vector<virusData> virusSet;//바이러스 정보 저장
int safeZoneCnt();
void virusAddZone();
void init_input();//초기화 및 초기 입력
void wall_install(int wallRowIndex, int wallColumnIndex, int wallCount);//.바이러스 벽 설치 및 증식
bool safeZone(int currentY, int currentX);//안전존 확인 변수
int main(void) {
	init_input();
	wall_install(0,0,0);
	cout << safeZone_Max << '\n';
}

bool safeZone(int currentY, int currentX) {
	return 0 <= currentY && currentY < N && 0 <= currentX && currentX < M;
}
void init_input() {
	N = M = 0;
	safeZone_Max = 0x80000000;//최대값 저장할 변수
	memset(map_arr, 0, sizeof(map_arr));
	scanf("%d %d", &N, &M);
	
	for (int mapRowIndex = 0; mapRowIndex < N; mapRowIndex++) {
		for (int mapColumnIndex = 0; mapColumnIndex < M; mapColumnIndex++) {
			scanf("%d", &map_arr[mapRowIndex][mapColumnIndex]);
			if (map_arr[mapRowIndex][mapColumnIndex] == VIRUS) {//바이러스 이면 좌표 저장
				virusSet.push_back({ mapRowIndex, mapColumnIndex});
			}
		}
	}
}
void virusAddZone() {
	memset(visitChk, 0, sizeof(visitChk));//0으로 초기화
	queue<virusData>virusAddQueue;//바이러스 증식 큐
	for (int virusNum = 0; virusNum < virusSet.size(); virusNum++) {//바이러스 저장
		virusAddQueue.push(virusSet[virusNum]);
	}
	while (!virusAddQueue.empty()) {//비어있을때 까지 증식
		virusData currentPos = virusAddQueue.front(); virusAddQueue.pop();
		for (int directionNum = 0; directionNum < 4; directionNum++) {
			virusData nextPos;
			nextPos.y = currentPos.y + directY[directionNum];
			nextPos.x = currentPos.x + directX[directionNum];
			if (safeZone(nextPos.y, nextPos.x) && map_arr[nextPos.y][nextPos.x] == 0 && visitChk[nextPos.y][nextPos.x] == 0) {
				visitChk[nextPos.y][nextPos.x] = VIRUS;
				virusAddQueue.push(nextPos);
			}
		}
	}
}
int safeZoneCnt() {
	int safeCnt = 0;//안전 지역
	for (int mapRowIndex = 0; mapRowIndex < N; mapRowIndex++) {
		for (int mapColumnIndex = 0; mapColumnIndex < M; mapColumnIndex++) {
			if (map_arr[mapRowIndex][mapColumnIndex] == 0 && visitChk[mapRowIndex][mapColumnIndex] == 0) {
				safeCnt++;
			}
		}
	}
	return safeCnt;
}
void wall_install(int wallRowIndex, int wallColumnIndex, int wallCount) {
	if (wallCount == 3) {//벽을 세운 개수가 3일때
		virusAddZone();
		int ret =safeZoneCnt();//결과값 저장
		safeZone_Max = safeZone_Max < ret ? ret : safeZone_Max;//최대값 갱신
		return;
	}
	for (int wY = wallRowIndex; wY < N; wY++) {
		for (int wX = wallColumnIndex; wX < M; wX++) {
			if (map_arr[wY][wX] == UNINSTALL_WALL) {
				map_arr[wY][wX] = INSTALL_WALL;
				wall_install(wY, wX + 1, wallCount+1);
				map_arr[wY][wX] = UNINSTALL_WALL;
			}
		}
		wallColumnIndex = 0;//0부터 시작하기 위해서
	}
}

728x90
반응형

'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글

2021년08월04일_11724-연결요소의개수  (0) 2021.08.04
15683 감시  (0) 2021.03.19
15686 치킨 배달  (0) 2021.03.16
14500 테트로미노  (0) 2021.03.16
14503 로봇 청소기  (0) 2021.03.15

댓글