반응형
#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);
	

}
반응형

+ Recent posts