https://www.acmicpc.net/problem/16236
문제
N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다.
아기 상어와 물고기는 모두 크기를 가지고 있고, 이 크기는 자연수이다. 가장 처음에 아기 상어의 크기는 2이고, 아기 상어는 1초에 상하좌우로 인접한 한 칸씩 이동한다.
아기 상어는 자신의 크기보다 큰 물고기가 있는 칸은 지나갈 수 없고, 나머지 칸은 모두 지나갈 수 있다. 아기 상어는 자신의 크기보다 작은 물고기만 먹을 수 있다. 따라서, 크기가 같은 물고기는 먹을 수 없지만, 그 물고기가 있는 칸은 지나갈 수 있다.
아기 상어가 어디로 이동할지 결정하는 방법은 아래와 같다.
-
더 이상 먹을 수 있는 물고기가 공간에 없다면 아기 상어는 엄마 상어에게 도움을 요청한다.
-
먹을 수 있는 물고기가 1마리라면, 그 물고기를 먹으러 간다.
-
먹을 수 있는 물고기가 1마리보다 많다면, 거리가 가장 가까운 물고기를 먹으러 간다.
-
거리는 아기 상어가 있는 칸에서 물고기가 있는 칸으로 이동할 때, 지나야하는 칸의 개수의 최솟값이다.
-
거리가 가까운 물고기가 많다면, 가장 위에 있는 물고기, 그러한 물고기가 여러마리라면, 가장 왼쪽에 있는 물고기를 먹는다.
-
아기 상어의 이동은 1초 걸리고, 물고기를 먹는데 걸리는 시간은 없다고 가정한다. 즉, 아기 상어가 먹을 수 있는 물고기가 있는 칸으로 이동했다면, 이동과 동시에 물고기를 먹는다. 물고기를 먹으면, 그 칸은 빈 칸이 된다.
아기 상어는 자신의 크기와 같은 수의 물고기를 먹을 때 마다 크기가 1 증가한다. 예를 들어, 크기가 2인 아기 상어는 물고기를 2마리 먹으면 크기가 3이 된다.
공간의 상태가 주어졌을 때, 아기 상어가 몇 초 동안 엄마 상어에게 도움을 요청하지 않고 물고기를 잡아먹을 수 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 공간의 크기 N(2 ≤ N ≤ 20)이 주어진다.
둘째 줄부터 N개의 줄에 공간의 상태가 주어진다. 공간의 상태는 0, 1, 2, 3, 4, 5, 6, 9로 이루어져 있고, 아래와 같은 의미를 가진다.
-
0: 빈 칸
-
1, 2, 3, 4, 5, 6: 칸에 있는 물고기의 크기
-
9: 아기 상어의 위치
아기 상어는 공간에 한 마리 있다.
출력
첫째 줄에 아기 상어가 엄마 상어에게 도움을 요청하지 않고 물고기를 잡아먹을 수 있는 시간을 출력한다.
예제 입력 6
6
1 1 1 1 1 1
2 2 6 2 2 3
2 2 5 2 2 3
2 2 2 4 6 3
0 0 0 0 0 6
0 0 0 0 0 9
예제 출력 6
39
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
int map[20][20];
int N;
int fishSize = 2, fishCount=2;
int y, x;
int dy[]={-1,0,1,0};
int dx[]={0,1,0,-1};
bool chk[20][20]= {false,};
int dist[20][20]={0,};
int eaty, eatx;
void bfs(){
queue <pair<int, int>> q1;
q1.push({y,x});
chk[y][x]=true;
while(!q1.empty()){
int y1 = q1.front().first;
int x1 = q1.front().second;
q1.pop();
for(int i=0;i<4;i++){
int ny = y1+dy[i];
int nx = x1+dx[i];
if(ny<0||nx<0||ny>=N||nx>=N||map[ny][nx]>fishSize) continue;
if(!chk[ny][nx]&&map[ny][nx]<=fishSize){
q1.push({ny,nx});
dist[ny][nx]=dist[y1][x1]+1;
chk[ny][nx]=true;
}
}
}
}
int simulation(){
int time = 0;
while(1){
memset(dist,0,sizeof(dist));
memset(chk,false,sizeof(chk));
bfs();
int temp_dist=1000;
int a=0;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(map[i][j]!=0&&map[i][j]<fishSize){
a=1;
if(dist[i][j]!=0&&dist[i][j]<temp_dist){
temp_dist=dist[i][j];
eaty=i;
eatx=j;
}
}
}
}
if(a==0) return time;
if(temp_dist==1000) return time;
fishCount--;
if(fishCount==0){
fishSize++;
fishCount=fishSize;
}
time+=temp_dist;
y=eaty;
x=eatx;
map[eaty][eatx]=0;
}
}
int main(){
freopen("input.txt","r",stdin);
cin >> N;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
cin>> map[i][j];
if(map[i][j]==9){
y=i, x=j;
map[i][j]=0;
}
}
}
cout << simulation();
return 0;
}
'개발자 > algorithm' 카테고리의 다른 글
백준 3190번 : 뱀 (c++) (0) | 2020.04.23 |
---|---|
백준 16234번 : 인구 이동 (c++) (0) | 2020.04.23 |
백준 15683번 : 감시 (c++) (0) | 2020.04.22 |
백준 14499번 : 주사위 굴리기 (c++) (0) | 2020.04.21 |
백준 17837번 : 새로운 게임 2 (c++) (0) | 2020.04.21 |