알고리즘
BOJ 17086 아기 상어2
curiosity314
2023. 10. 30. 22:24
https://www.acmicpc.net/problem/17086
17086번: 아기 상어 2
첫째 줄에 공간의 크기 N과 M(2 ≤ N, M ≤ 50)이 주어진다. 둘째 줄부터 N개의 줄에 공간의 상태가 주어지며, 0은 빈 칸, 1은 아기 상어가 있는 칸이다. 빈 칸과 상어의 수가 각각 한 개 이상인 입력만
www.acmicpc.net
간단한 최단거리 찾기 문제이다.
문제를 잘 이해하면 잘 풀 수 있다 BFS로 뚝딱 뚝딱 짜주면 된다.
8방향 index 짜주는것도 어렵지 않고
n=50이라서 O(N^4)으로 풀었다.
#include <iostream>
#include <algorithm>
#include <memory.h>
#include <vector>
#include <queue>
using namespace std;
int n,m;
int space[55][55];
int di[] = {0,-1,-1,-1,0,1,1,1};
int dj[] = {1,1,0,-1,-1,-1,0,1};
bool visited[55][55];
int dist[55][55];
int minn,maxx;
bool is_ok(int i, int j) {
if (i<1 || i>n || j<1 || j>m || visited[i][j]) return false;
else return true;
}
void bfs(int i, int j) {
minn = 987654321;
memset(visited,0,sizeof(visited));
memset(dist, 0, sizeof(dist));
queue<pair<int, int> > q;
q.push(make_pair(i,j));
visited[i][j] = true;
int qff = q.front().first;
int qfs = q.front().second;
dist[qff][qfs] = 0;
while(!q.empty()) {
qff = q.front().first;
qfs = q.front().second;
q.pop();
for (int k=0; k<8; k++) {
int ti = qff+di[k];
int tj = qfs+dj[k];
if (is_ok(ti,tj)) {
q.push(make_pair(ti,tj));
dist[ti][tj] = dist[qff][qfs] + 1;
visited[ti][tj] = 1;
}
}
}
for (int row=1; row<=n; row++) {
for (int col=1; col<=m; col++) {
if (row==i && col==j) continue;
if (space[row][col]==1) {
minn = min(minn, dist[row][col]);
}
}
}
}
int main() {
cin>>n>>m;
for (int i=1; i<=n; i++) {
for (int j=1; j<=m; j++) {
cin>>space[i][j];
}
}
for (int i=1; i<=n; i++) {
for (int j=1; j<=m; j++) {
if (space[i][j]==0) {
bfs(i,j);
maxx = max(maxx, minn);
}
}
}
cout<<maxx;
}