어흥

[백준 17086] 아기 상어 2 (C++) 본문

알고리즘/백준

[백준 17086] 아기 상어 2 (C++)

라이언납시오 2020. 5. 22. 13:17
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/17086

 

17086번: 아기 상어 2

첫째 줄에 공간의 크기 N과 M(2 ≤ N, M ≤ 50)이 주어진다. 둘째 줄부터 N개의 줄에 공간의 상태가 주어지며, 0은 빈 칸, 1은 아기 상어가 있는 칸이다. 빈 칸의 개수가 한 개 이상인 입력만 주어진다.

www.acmicpc.net

1. 주의할 점

- BFS로 접근하되, 시작지점을 아기상어의 위치로 잡는다

 

2. 구현

- 모든 Check[][]값을 MAX로 초기화한다

- 아기상어가 위치한 곳을 큐에 넣고, Check[][]값을 0으로 설정한다

- 8방향 탐색을 통해 이동하려는 곳의 Check[][]값이 현재 이동한 거리(CV)+1보다 크다면 이동하고 Result를 CV+1와 비교하여 큰 값을 갖도록 한다

 

#define MAX 987654321
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
struct info {
	int x, y, val;
};
info tmp;
int dx[8] = { 0,1,1,1,0,-1,-1,-1 };
int dy[8] = { -1,-1,0,1,1,1,0,-1 };
int arr[50][50];
int check[50][50];

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int row, col;
	cin >> row >> col;
	queue<info> q;
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			cin >> arr[i][j];
			check[i][j] = MAX;
			if (arr[i][j] == 1) {
				tmp.x = j;
				tmp.y = i;
				tmp.val = 0;
				q.push(tmp);
				check[i][j] = 0;
			}
		}
	}
	int result = 0;
	while (!q.empty()) {
		int cx = q.front().x;
		int cy = q.front().y;
		int cv = q.front().val;
		q.pop();
		for (int i = 0; i < 8; i++) {
			int nx = cx + dx[i];
			int ny = cy + dy[i];
			if (nx >= 0 && ny >= 0 && nx < col&&ny<row && check[ny][nx]>cv + 1) {
				check[ny][nx] = cv + 1;
				tmp.x = nx;
				tmp.y = ny;
				tmp.val = cv + 1;
				q.push(tmp);
				result = max(result, cv + 1);
			}
		}
	}
	cout << result;
	system("pause");
	return 0;
}
728x90
반응형
Comments