您的位置:首页 > 其它

走迷宫

2016-04-13 16:44 218 查看

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

<i||e

>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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索+二分