16236 아기상어

 

 

문제에서 주어지는 조건대로 구현 하면 된다.

 

 

#include <stdio.h>
#include <queue>
#include <algorithm>
using namespace std;

struct Node {
	int x, y;
	Node(){}
	Node(int x,int y):x(x),y(y){}
};

struct Next {
	int x, y, diff;
	Next(){}
	Next(int x, int y, int d):x(x),y(y),diff(d){}
};

int n, cx, cy, time, sz, cnt;
int map[20][20];
int check[20][20];
int dx[] = { -1,0,1,0 };
int dy[] = { 0,-1,0,1 };
Next v[400];
int nIdx;

void bfs() {
	check[cx][cy] = 1;
	queue<Node> q;

	q.push(Node(cx, cy));

	while (!q.empty()) {
		int x = q.front().x;
		int y = q.front().y;
		q.pop();

		//상어보다 작은 물고기 찾음
		if (map[x][y] != 0 && map[x][y] < sz) {
			v[nIdx++] = Next(x, y, check[x][y] - 1);
		}

		for (int i = 0; i < 4; i++) {
			int ax = x + dx[i];
			int ay = y + dy[i];

			if (ax >= 0 && ay >= 0 && ax < n&&ay < n && check[ax][ay] == 0) {
				if (map[ax][ay] <= sz) {
					q.push(Node(ax, ay));
					check[ax][ay] = check[x][y] + 1;
				}
			}
		}
	}
}

void clear() {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			check[i][j] = false;
		}
	}
}

int main() {
	scanf("%d", &n);

	time = 0;
	sz = 2;
	cnt = 2;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			scanf("%d", &map[i][j]);
			//cx, cy = 현재 아기상어 위치
			if (map[i][j] == 9) {
				cx = i;
				cy = j;
			}
		}
	}

	while (true) {
		//배열 초기화
		clear();
		nIdx = 0;

		//탐색
		bfs();
		
		//먹을 수 있는 물고기 없으면 종료
		if (nIdx == 0) break;

		//가장 가깝고 위에있으면서 왼쪽에 있는 물고기 찾음
		Next nn = v[0];
		for (int i = 1; i < nIdx; i++) {
			if (nn.diff > v[i].diff) {
				nn = v[i];
			}
			else if (nn.diff == v[i].diff) {
				if (nn.x > v[i].x) {
					nn = v[i];
				}
				else if (nn.x == v[i].x) {
					if (nn.y > v[i].y) {
						nn = v[i];
					}
				}
			}
		}

		cnt--;
		if (cnt == 0) {
			sz++;
			cnt = sz;
		}

		//해당칸으로 이동 및 맵 최신화
		map[nn.x][nn.y] = 9;
		map[cx][cy] = 0;

		cx = nn.x;
		cy = nn.y;

		time += nn.diff;
	}

	printf("%d\n", time);
}

'BOJ::문제풀이' 카테고리의 다른 글

17140 이차원배열과 연산  (0) 2019.04.17
16235 나무 재테크  (0) 2018.10.22
16234 인구 이동  (0) 2018.10.22
15684 사다리 조작  (0) 2018.09.07
2580 스도쿠  (0) 2018.04.21

+ Recent posts