题意:
给定一个迷宫,问从左上角到右下角的最短路线。(要输出路径)
方法一:
bfs
思路:利用层次遍历(bfs)寻找最短路径。
fa[ ][ ]表示当前坐标的父亲坐标。
将起点(0,0)加入队列,四个方向遍历相邻坐标,如果相邻坐标未访问过并且可以走,则入队列,并且将当前坐标指定父亲坐标。
以此类推,找到终点(n-1,m-1)。再通过递归输出最短路径的线路。
#include <bits/stdc++.h> using namespace std; int a[15][15],vis[15][15]; int b[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//上下左右四个方向 pair<int,int> fa[15][15];//记录当前下标的父亲下标 void dfs(int x,int y){//dfs打印路径 if(x==0&&y==0)//如果到达左上角,则退出 return; auto t=fa[x][y]; dfs(t.first,t.second); printf("(%d,%d)\n",x,y); } int main(){ int n,m; while(cin >> n >> m){ for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin >> a[i][j];//输入迷宫 memset(vis,0,sizeof(vis)); memset(fa,0,sizeof(fa)); queue<pair<int,int>> q;//队列 q.push({0,0});//左上角坐标入队列 vis[0][0]=1; while(!q.empty()){ auto u=q.front(); q.pop(); if(u.first==n-1&&u.second==m-1){ break; } for(int i=0;i<4;i++){//遍历四个方向 int nx=u.first+b[i][0],ny=u.second+b[i][1]; if(nx<0||nx>=n||ny<0||ny>=m) continue; if(vis[nx][ny]==0&&a[nx][ny]==0){//如果当前坐标未访问过并且可以走,则入队列,并且当前坐标指定父亲坐标 fa[nx][ny]={u.first,u.second}; q.push({nx,ny}); vis[nx][ny]=1; } } } printf("(%d,%d)\n",0,0); dfs(n-1,m-1); } return 0; }
时间复杂度:空间复杂度:
方法二:
dfs
思路:深度优先搜索,利用二维数组记录起点到当前点的最短距离。向四个方向(上下左右)dfs,维护最短距离,。最后逆向输出最短路径。
#include <bits/stdc++.h> using namespace std; int a[15][15],vis[15][15]; int b[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//上下左右四个方向 pair<int,int> fa[15][15];//记录当前下标的父亲下标 int dis[15][15];//记录起点到当前点的最短距离 int n,m; void f(int x,int y){//dfs打印路径 if(x==0&&y==0)//如果到达左上角,则退出 return; auto t=fa[x][y]; f(t.first,t.second); printf("(%d,%d)\n",x,y); } void dfs(int x,int y){ for(int i=0;i<4;i++){//遍历四个方向 int nx=x+b[i][0],ny=y+b[i][1]; if(nx<0||nx>=n||ny<0||ny>=m) continue; if(a[nx][ny]==0&&vis[nx][ny]==0&&dis[nx][ny]>dis[x][y]+1){//如果当前坐标可走,并且没访问过,并且距离短,则访问该坐标 vis[nx][ny]=1;//设置为已访问 dis[nx][ny]=dis[x][y]+1;//更新最短距离 fa[nx][ny]={x,y};//设置父亲坐标 dfs(nx,ny); vis[nx][ny]=0;//还原 } } } int main(){ while(cin >> n >> m){ for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin >> a[i][j];//输入迷宫 memset(dis,0x3f,sizeof(dis)); memset(vis,0,sizeof(vis)); memset(fa,0,sizeof(fa)); vis[0][0]=1; dis[0][0]=0; dfs(0,0); printf("(%d,%d)\n",0,0); f(n-1,m-1); } return 0; }
时间复杂度:空间复杂度: