본문 바로가기
알고리즘/백준

백준 16469 소년 점프 C++

by ash9river 2024. 10. 21.

간단한 해설

 

방문 배열을 3개 만들어서 bfs를 통해 최소 방문을 시간을 기록한다.

3개 배열을 비교하고, 그 최대값이  세 악당이 모일 때 걸린 시간이다.

 

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int r,c;
int board[100][100];
int visited[3][100][100];
int dy[4]={0,0,1,-1};
int dx[4]={1,-1,0,0};
bool set(int index,int y,int x,int val){
	if(y<0||y>=r||x<0||x>=c) return false;
	if(board[y][x]==1) return false;
	if(visited[index][y][x]<=val) return false;
	return true;
}
int main(){
	cin.tie(0);
	ios_base::sync_with_stdio(0);
	fill(&visited[0][0][0],&visited[2][99][100],987654321);
	cin>>r>>c;
	for(int i=0;i<r;++i){
		string str;
		cin>>str;
		for(int j=0;j<c;++j){
			board[i][j]=str[j]-'0';
		}
	}
	vector<pair<int,int>> v(3);
	for(int i=0;i<3;++i){
		cin>>v[i].first>>v[i].second;
		--v[i].first;
		--v[i].second;
		visited[i][v[i].first][v[i].second]=0;
	}
	for(int k=0;k<3;++k){
		priority_queue<pair<int,pair<int,int>>> q;
		q.push({0,{v[k].first,v[k].second}});
		while(!q.empty()){
			int crnTime=-q.top().first;
			int crnY=q.top().second.first;
			int crnX=q.top().second.second;
			q.pop();
			for(int i=0;i<4;++i){
				int ny=crnY+dy[i];
				int nx=crnX+dx[i];
				int nxtTime=crnTime+1;
				if(set(k,ny,nx,nxtTime)){
					visited[k][ny][nx]=nxtTime;
					q.push({-nxtTime,{ny,nx}});
				}
			}
		}
	}
	int ans=987654321;
	for(int i=0;i<r;++i){
		for(int j=0;j<c;++j){
			if(board[i][j]==1) continue;
			bool state=false;
			for(int k=0;k<3;k++){
				if(visited[k][i][j]==987654321) state=true;
			}
			if(state) continue;
			int tmpAns=max({visited[0][i][j],visited[1][i][j],visited[2][i][j]});
			ans=min(ans,tmpAns);
		}
	}
	if(ans==987654321){
		cout<<-1;
	}
	else{
		int gae=0;
		for(int i=0;i<r;++i){
			for(int j=0;j<c;++j){
				if(board[i][j]==1) continue;
				bool state=false;
				for(int k=0;k<3;k++){
					if(visited[k][i][j]==987654321) state=true;
				}
				if(state) continue;
				int tmpGae=max({visited[0][i][j],visited[1][i][j],visited[2][i][j]});
				if(ans==tmpGae) ++gae;
			}
		}
		cout<<ans<<"\n"<<gae;
	}
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 27896 특별한 서빙 C++  (0) 2024.11.08
백준 23883 알고리즘 수업 - 선택 정렬 3 C++  (0) 2024.10.22
백준 16562 친구비 C++  (1) 2024.10.15
백준 27978 보물 찾기 2 C++  (0) 2024.10.10
백준 10830 행렬 제곱 C++  (1) 2024.10.06