本题目要求读入2个整数A和B,表示A行B列的迷宫,迷宫中有障碍点。给定起始点和终止点,要求从起始点到终止点的最小步数。
输入格式:
输入n组如下的数: 输入2个整数A和B,表示A行B列的迷宫,然后输入一个整数C,表示障碍点数,再依次输入C个障碍点的坐标(x,y),最后输入起始点和终止点的坐标(xs,ys)和(xe,ye)。
输出格式:
针对每组数,输出从起始点到终止点的最小步数。若无法达到,则输出“Not arrive”。
输入样例:
在这里给出一组输入。例如:
2 5 5 3 0 2 3 4 1 1 0 1 4 4 3 3 2 0 1 1 2 0 0 2 2
输出样例:
在这里给出相应的输出。例如:
9 4
无法达到,则输出“Not arrive”的处理办法:
先设置一个很大的数初始化最小步数,如果搜索后还是这个数,说明这个步数根本没被更新过,说明不能到达
优化方法:
因为是算最短步数,两点之间的跨越不带权值,那么原本我们需要再设置一个数组标记是否走过,我们可以简化到地图上标记,走过也就相当于障碍物不能再走,就把这个位置在地图上标记为2,回溯的时候再另他为0 。就可以简化为一个二维数组。
#include<bits/stdc++.h>
using namespace std;
int sx,sy,ex,ey,minn;
int mapp[10000][10000];//数组不要开太大了哦不然会内存超限的
int h,l,m;
void dfs(int x,int y,int step)
{
int next[4][2]= {{0,1},{1,0},{0,-1},{-1,0}};
if(x==ex&&y==ey)//到达终点
{
//更新最小值
if(step<minn)
minn=step;
return;
}
for(int k=0; k<4; k++)
{
int tx=x+next[k][0];
int ty=y+next[k][1];
if(tx<0||tx>=h||ty<0||ty>=l)
continue;
if(mapp[tx][ty]==0)
{
mapp[tx][ty]=2;
dfs(tx,ty,step+1);
mapp[tx][ty]=0;//记得回溯
}
}
return ;//别忘了哦
}
int main()
{
int n;
cin>>n;
while(n--)
{
cin>>h>>l;//地图行列
cin>>m;
while(m--)
{
int a,b;
cin>>a>>b;
mapp[a][b]=1;//障碍处标为1
}
cin>>sx>>sy>>ex>>ey;//输入起点终点坐标
minn=99999999;//先设最短路径为不可达到的大数字
mapp[sx][sy]=2;//先标记起点为路径中的点
dfs(sx,sy,0);//从起点开始搜索
if(minn<99999999)
cout<<minn;
else
cout<<"Not arrive";
if(n!=0)cout<<endl;
memset(mapp,0,sizeof(mapp));
}
return 0;
}