小林周末到森林公园爬山游玩,游玩结束后准备打车回家。已知公园范围在地图上是一个矩形,矩形四边是公路,小林要回到公路上,才能打车回家。
给定小林现在的位置,以及公园的地形图(w*h的形式,每个数代表该坐标位置的高度)小林只能向上下左右四个方向走动,一次走动一格,且不能上坡,请找出最短下山路径。
输入:
三行,数据用空格分隔,第一行为地图的长、宽,第二行为小林的起始坐标x,y,(坐标从0开始),第三行为地图中每个坐标位置的高度(行优先顺序)
地图长宽不超过65535,高度0-255
输出:3个整数,用空格分隔,终点坐标x,y,以及小林走动次数(唯一)。
样例输入:
4 4
2 2
9 2 9 9 9 4 9 9 9 5 5 9 9 9 9 9
输出:
1 0 3
#include <cstdio>
using namespace std;
int a[100][100]={};
int visit[100][100]={false};
int minstp=-1,lastx,lasty;
int w,h;
void dfs(int x,int y,int step){
//如果越界直接返回
if(x==w||y==h||x==-1||y==-1) return;
visit[x][y] = true;//标记
int value = a[x][y];
if(x==0||y==0||x==h-1||y==w-1){//边界条件
if(minstp==-1){
minstp=step;
lastx=x;
lasty=y;
}
else if(step<minstp){
minstp=step;
lastx=x;
lasty=y;
} //到达公路进行优化
}else{
if(a[x+1][y]<=value&&visit[x+1][y]== false) dfs(x+1,y,++step);//向上
if(a[x-1][y]<=value&&visit[x-1][y]== false) dfs(x-1,y,++step);//向下
if(a[x][y-1]<=value&&visit[x][y-1]== false) dfs(x,y-1,++step);//向左
if(a[x][y+1]<=value&&visit[x][y+1]== false) dfs(x,y+1,++step);//向右
}
}
int main(){
scanf("%d%d",&w,&h);
int x,y;
scanf("%d%d",&x,&y);
for(int i=0;i<w;i++)
for(int j=0;j<h;j++)
scanf("%d",&a[j][i]);
dfs(x,y,0);
if(minstp==-1) printf("-1 -1 -1");
else printf("%d %d %d\n",lastx,lasty,minstp);
return 0;
}