PS/깊이 우선 탐색, 너비 우선 탐색[DFS, BFS]

17086 아기 상어 2(c++)

SeungbeomKim 2022. 8. 12. 20:25

https://www.acmicpc.net/problem/17086

 

17086번: 아기 상어 2

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

www.acmicpc.net

<코드>

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

int n,m;

int ans=0;
int board[51][51];
int mov[8][2] = {{-1,0},{1,0},{0,1},{0,-1},{1,1},{-1,-1},{1,-1},{-1,1}};
int bfs(int a,int b)
{
	bool visited[51][51]={false};
	queue<pair<pair<int,int>,int>>q;
	visited[a][b] = true;
	q.push({make_pair(a,b),0});

	while(!q.empty())
	{
		pair<pair<int,int>,int> cur = q.front();
		q.pop();
		int cnt = cur.second;
		if(board[cur.first.first][cur.first.second]) {
			return cnt;
		}
		for(int i=0;i<8;i++)
		{
			int sr = cur.first.first + mov[i][0];
			int sc = cur.first.second + mov[i][1];
			
			if(sr>=0 && sc>=0 && sr<n && sc<m && !visited[sr][sc])
			{
				
				visited[sr][sc]=true;
				q.push({make_pair(sr,sc),cnt+1});
			}
		}
		
	}
}
int main()
{
	memset(board,0,sizeof(board));
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			cin>>board[i][j];
		}
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			if(!board[i][j]){
				ans = max(ans,bfs(i,j));
			}
		}
	}
	cout<<ans<<'\n';
}