/* 读入一个m行n列的数组,其中1表示空地,2表示障碍物;
//从起始点走到终点距离最短是多少,要求给出起始点和终点坐标。
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1
4 3
*/
// (x-1,y)
// (x,y-1) (x,y) (x,y+1)
// (x+1,y)
#include<iostream>
using namespace std;
int m,n,p,q,mins=999999999;
int a[100][100];//1表示空地,2表示障碍物
int v[100][100];//0表示未访问,1表示访问
void dfs(int x,int y,int step){
if(x==p&&y==q){//终点
if(step<mins)
mins=step;
return ;
}
//顺时针试探
//右
if(a[x][y+1]==1 && v[x][y+1]==0){
v[x][y+1]=1;
dfs(x,y+1,step+1);
v[x][y+1]=0;
}
//下
if(a[x+1][y]==1 && v[x+1][y]==0){
v[x+1][y]=1;
dfs(x+1,y,step+1);
v[x+1][y]=0;
}
//左
if(a[x][y-1]==1 && v[x][y-1]==0){
v[x][y-1]=1;
dfs(x,y-1,step+1);
v[x][y-1]=0;
}
//上
if(a[x-1][y]==1 && v[x-1][y]==0){
v[x-1][y]=1;
dfs(x-1,y,step+1);
v[x-1][y]=0;
}
return ;
}
int main(){
int startx,starty;//起点坐标
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];//1表示空地,2表示障碍物
cin>>startx>>starty>>p>>q; //终点坐标
//从起点进行深度优先搜索
v[startx][starty]=1;
dfs(startx,starty,0);
cout<<mins<<endl;
return 0;
}
优化代码:
#include<iostream>
using namespace std;
int m,n,p,q;
int mins=99999999;
int a[100][100];//1表示空地,2表示障碍物
int v[100][100];//0表示未访问,1表示访问
//方向数组 x-1,y
// x,y-1 x,y x,y+1
// x+1,y
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void dfs(int x,int y,int step){
if(x==p&&y==q){
if(step<mins) mins=step;
return;
}
for(int i=0;i<4;i++){
int tx,ty;//方向点
tx=x+dx[i];
ty=y+dy[i];
if(a[tx][ty]==1&&v[tx][ty]==0){
v[tx][ty]=1;
dfs(tx,ty,step+1);
v[tx][ty]=0;
}
}
return ;
}
int main(){
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
int startx,starty;
cin>>startx>>starty>>p>>q;
dfs(startx,starty,0);
cout<<mins<<endl;
return 0;
}