반응형
#include <bits/stdc++.h>
using namespace std;
int n, arr[30][30],ch[30][30],res;
int dx[4] = {-1,0,1,0};
int dy[4] = {0, -1,0, 1};
struct State{
int x,y,dis;
State(int a, int b, int c){
x = a;
y = b;
dis = c;
}
bool operator<(const State &bb) const{
if(dis==bb.dis){
if(x==bb.x) return y>bb.y;
else return x>bb.x;
}
else return dis>bb.dis;
}
};
struct Lion{
int x,y, size=2, eat=0;
void sizeup(){
size++;
eat=0;
}
};
int main(){
//freopen("input.txt.txt","rt",stdin);
ios::sync_with_stdio(false);
cin.tie(0);
Lion Simba;
scanf("%d",&n);
priority_queue<State> Q;
for(int i=0; i<n; i++){
for(int j=0; j<n;j++){
int tmp;
scanf("%d",&tmp);
if(tmp==9){
Simba.x = i;
Simba.y = j;
}
else{
arr[i][j] = tmp;
}
}
}
// 심바현재위치에서 갈수 있는 점들 탐색
// 갈수 있는 점들 우선순위 큐에 넣어준다.
// 우선순위큐에서 우선순위 가장 높은 방문할 정점(지나갈 수 있는 것)을 뽑는다.
// 그 정점이 먹을 수 있으면 먹고 , 심바 위치를 그 정점으로 바꿔준다.
// 큐는 먹이 정점을 모두다 방문 하면 끝난다.
Q.push(State(Simba.x, Simba.y, 0));
while(!Q.empty()){
int cur_x = Q.top().x;
int cur_y = Q.top().y;
int cur_dis = Q.top().dis;
Q.pop();
if(arr[cur_x][cur_y]!=0 && arr[cur_x][cur_y]<Simba.size){
Simba.x=cur_x;
Simba.y=cur_y;
Simba.eat++;
if(Simba.eat >= Simba.size) Simba.sizeup();
arr[cur_x][cur_y] = 0;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
ch[i][j]=0;
}
}
while(!Q.empty()) Q.pop();
res = cur_dis;
}
for(int i=0; i<4; i++){
int nx = cur_x+dx[i];
int ny = cur_y+dy[i];
if(nx<0||nx>=n||ny<0||ny>=n||ch[nx][ny]>0) continue;
if(arr[nx][ny] > Simba.size) continue;
ch[nx][ny] = 1;
Q.push(State(nx,ny,cur_dis+1));
}
}
printf("%d",res);
}
반응형
'Algorithm > etc' 카테고리의 다른 글
LIS 최대 부분 증가수열 - DP (0) | 2022.01.25 |
---|---|
랜선자르기, 재귀, 메모이제이션 (0) | 2022.01.24 |
미로 최단거리 BFS 활용 (0) | 2022.01.22 |
피자 배달 거리 문제 - DFS 활용 , 순열 조합 활용 (0) | 2022.01.22 |
순열 구하기 - DFS (0) | 2022.01.20 |