输入n行m列,用0表示空地,1表示墙,起点为(1,1),输出从起点到终点最少需要多少步
输入样例:先输入n,m,然后输入终点坐标
5 4 4 3
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
输出样例:
7
方法一:BFS
bfs的经典例题,定义结构体存入坐标和当前步骤,并将其用队列保存起来,每次取队首元素,这样每次得到的步骤都会是最少
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int a[100][100];
int v[100][100];
int n,m,pp,qq;
struct node
{
int x,y;
int step;
};
queue<node>q;
int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
int main()
{
cin>>n>>m>>pp>>qq;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
struct node t;
t.x=1;
t.y=1;
v[t.x][t.y]=1;
t.step=0;
q.push(t);
while(!q.empty())
{
if(q.front().x==pp&&q.front().y==qq)
{
break;
}
for(int i=0;i<4;i++)
{
int nx=q.front().x+dir[i][0];
int ny=q.front().y+dir[i][1];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[nx][ny]==0&&v[nx][ny]==0)
{
v[nx][ny]=1;
t.x=nx;
t.y=ny;
t.step=q.front().step+1;
q.push(t);
}
}
q.pop();
}
cout<<q.front().step;
return 0;
}
方法二:DFS
这样可以记录下来路径,并且输出:
#include<iostream>
using namespace std;
int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};//四个方向
int n,m,p,q;
int a[1010][1010];//记录地图
int v[1010][1010];//记录是否走过
int cnt=0;
int ans=99999999;
int sum=0;
//定义结构体记录路径方便输出
struct ss
{
int xx,yy;
};
struct ss stu[1010];
void dfs(int x,int y,int step)
{
if(x==p&&y==q)
{
cnt++;
cout<<"第"<<cnt<<"组解:"<<endl;
if(ans>step) ans=step;
for(int i=0;i<=sum;i++)//输出该方法的路径
{
cout<<stu[i].xx<<" "<<stu[i].yy<<endl;
}
return ;
}
for(int k=0;k<4;k++)
{
int nx=x+dir[k][0];
int ny=y+dir[k][1];
if(nx<1||nx>n||ny<1||ny>m) continue;//判断是否越界
if(a[nx][ny]==0&&v[nx][ny]==0)//判断是否为空地并且没有走过
{
v[nx][ny]=1;
sum++;
stu[sum].xx=nx;
stu[sum].yy=ny;
dfs(nx,ny,step+1);
v[nx][ny]=0;
sum--;
}
}
}
int main()
{
cin>>n>>m>>p>>q;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
v[1][1]=1;
stu[0].xx =1;
stu[0].yy =1;
dfs(1,1,0);
cout<<ans;
return 0;
}