Algorithm/백준
[백준] 17086번: 아기 상어2
youngine
2021. 2. 15. 11:53
17086번: 아기 상어 2
첫째 줄에 공간의 크기 N과 M(2 ≤ N, M ≤ 50)이 주어진다. 둘째 줄부터 N개의 줄에 공간의 상태가 주어지며, 0은 빈 칸, 1은 아기 상어가 있는 칸이다. 빈 칸의 개수가 한 개 이상인 입력만 주어진다.
www.acmicpc.net
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#define MAX 51
using namespace std;
const int dy[48] = { 1,-1,0,0,1,-1,1,-1 };
const int dx[8] = { 0,0,1,-1,-1,-1,1,1 };
int n, m;
int map[MAX][MAX];
int visit[MAX][MAX];
vector<int>pos;
void bfs(int a, int b) {
for (int i = 1;i < MAX;i++) {
for (int j = 1;j <MAX;j++) {
visit[i][j] = false;
}
}
vector<int>calc;
queue<pair<int, int>>q;
queue<int>dis;
q.push(make_pair(a, b));
dis.push(0);
visit[a][b] = true;
while (!q.empty()) {
int y = q.front().first;
int x = q.front().second;
int d = dis.front();
q.pop(); dis.pop();
if (map[y][x] == 1 && d != 0) {
calc.push_back(d);
break;
}
for (int i = 0;i < 8;i++) {
int ny = y + dy[i];
int nx = x + dx[i];
if (visit[ny][nx]) continue;
if (ny < 1 || nx<1 || ny>n || nx>m) continue;
visit[ny][nx] = true;
q.push({ ny,nx }); dis.push(d + 1);
}
}
int temp = *min_element(calc.begin(), calc.end());
pos.push_back(temp);
}
int main() {
cin >> n >> m;
for (int i = 1;i <= n;i++) {
for (int j = 1;j <= m;j++) {
cin >> map[i][j];
}
}
for (int i = 1;i <= n;i++) {
for (int j = 1;j <= m;j++) {
if(map[i][j]!=1) bfs(i, j);
}
}
int ans = *max_element(pos.begin(), pos.end());
cout << ans;
}