BAEKJOON/graphs

[baekJoon16956] 늑대와 양(BFS/DFS)

ferozsun 2020. 8. 3. 12:12

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

 

16956번: 늑대와 양

크기가 R×C인 목장이 있고, 목장은 1×1 크기의 칸으로 나누어져 있다. 각각의 칸에는 비어있거나, 양 또는 늑대가 있다. 양은 이동하지 않고 위치를 지키고 있고, 늑대는 인접한 칸을 자유롭게 �

www.acmicpc.net


IDEA

※ 늑대의 상하좌우에 양이 있다면, 양을 지킬 수 없다.

  (0,1)  
(1,0) (1,1) (1,2)
  (2,1)  

▷ 'W'의 좌표를 기준으로 상하좌우에 'S'가 있다면 0을 출력,

    '.'이 있다면 울타리 'D'로 바꾼 후 1을 출력

 

▷ 상하좌우 좌표에 접근하기 위한 표

  N S E W
x -1 1 0 0
y 0 0 1 -1

배열 동적 할당 (Dynamic allocation)

다음과 같이 배열 크기를 변수로 두는 것 가능

int* arr = new int[length]();

초기화

int *arr = new int[5] {1, 2, 3, 4, 5};

해제

dekete[] arr;

2차원 배열 동적 할당

가장 오른쪽 차원이 컴파일 타임 상수일 경우

int (*arr)[5] = new int[10][5];

아니라면

int** arr = new int*[10];
for(int count = 0; count < 10; ++count)
	arr[count] = new int[5];

해제(할당한 반대 순서로 해제)

for(int count = 0; count < 10; ++count)
	delete[] array[count];
delete[] array;

/*
날짜: 2020.08.03
번호: 16956
문제:
*/
#include <iostream>
using namespace std;
int main(void) {
	int R, C; // 행, 열
	cin >> R >> C;
	bool protect = true; // 양을 지킬 수 있는지

	char** farm = new char* [R];
	for (int i = 0; i < R; ++i) {
		farm[i] = new char[C];
	}

	/* 입력 */
	for (int i = 0; i < R; ++i) {
		for (int j = 0; j < C; ++j) {
			cin >> farm[i][j];
		}
	}

	//			   N  S  E  W
	int dx[4] = { -1, 1, 0, 0 };
	int dy[4] = { 0, 0, 1, -1 };

	int newX, newY;

	for (int i = 0; i < R; ++i) {
		for (int j = 0; j < C; ++j) {

			/* 늑대의 사방에 양이 있다면 0출력 */
			if (farm[i][j] == 'W') {
				for (int k = 0; k < 4; ++k) {

					newX = i + dx[k];
					newY = j + dy[k];

					if (-1 < newX && newX < R && -1 < newY && newY < C) {
						if (farm[newX][newY] == 'S') {
							protect = false;
						}

						else if (farm[newX][newY] == '.') {
							farm[newX][newY] = 'D';
						}
					}
				}
			}
		}
	}

	/* 결과 출력 */
	cout << (int)protect << "\n";

	for (int i = 0; i < R; ++i) {
		for (int j = 0; j < C; ++j) {
			cout << farm[i][j];
		}
		cout << "\n";
	}
}