走迷宫

Description

Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲。这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫。整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度。

这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线。走迷宫的取胜规则很有意思,看谁能更快地找到一条路径,其路径上单元格最大难度值与最小难度值之差是最小的。当然了,或许这样的路径不是最短路径。

     机器人卡多现在在迷宫的左上角(第一行,第一列)而出口在迷宫的右下角(第N行,第N列)。

卡多很聪明,很快就找到了这样的一条路径。你能找到吗?

Input

第一行:         N     表示迷宫是N*N方阵        (2≤ N≤ 100)

接下来有N行, 每一行包含N个整数,用来表示每个单元格中难度 (0≤任意难度≤120)。

Output

输出为一个整数,表示路径上最高难度与和最低难度的差。

Sample Input

51 1 3 6 81 2 2 5 54 4 0 3 38 0 2 3 44 3 0 2 1

Sample Output

2

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int e[105][105],vis[105][105];
int r[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
struct node{
	int x,y,s;
};
int n,mixn;
int mmin=999999,mmax=-1;
int bfs(int x,int y,int p,int w){
	queue<node> q;
	struct node t1,t2;
	t1.x=x;t1.y=y;
	q.push(t1);
	while(!q.empty()){
		t1=q.front();q.pop();
		for(int i=0;i<4;i++){
			t2.x=t1.x+r[i][0];
			t2.y=t1.y+r[i][1];
			if(t2.x<1||t2.x>n||t2.y<1||t2.y>n
			||vis[t2.x][t2.y]||e[t2.x][t2.y]<p||e[t2.x][t2.y]>w)
			continue;
			if(t2.x==n&&t2.y==n){
			   return 1;
		    }
			vis[t2.x][t2.y]=1;
			q.push(t2);
		}
	}
	return 0;
}
int find(int k){
	for(int i=mmin;i<=mmax-k;i++){
		if(e[1][1]<i||e[1][1]>i+k) continue;
		if(e[n][n]<i||e[n][n]>i+k) continue;
		memset(vis,0,sizeof(vis));
		vis[1][1]=1;
		if(bfs(1,1,i,i+k)){
			return true;
		}
	}
	return false;
}
int main(){
	scanf("%d",&n);
	memset(e,0,sizeof(e));
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			scanf("%d",&e[i][j]);
			if(mmin>e[i][j]) mmin=e[i][j];
			if(mmax<e[i][j]) mmax=e[i][j];
		}
	}
	int l=0,r=mmax-mmin;
	mixn=0;
	while(l<r){
		int mid=(l+r)/2;
		if(find(mid)){
			r=mid;
		}
		else{
		    l=mid+1;
		}
	}
	cout << r <<endl;
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值