描述:
给出迷宫,起点和终点,求出起点到终点的最短距离,(只能上下左右走,一格距离1)
DFS
#include <iostream> #include <algorithm> using namespace std; //迷宫,x,y从 (1,1)开始、 int minn = 0x3f3f3f3f; int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}}; //方向坐标 向右,向下,向左,向上 int a[50][50]; int book[50][50]; int n,m; int sx,sy,ex,ey; void DFS(int x,int y,int step) //当前的位置,已经走的步数 { if(x == ex && y == ey) // 如果已经到了,比较步数 { if(step < minn) minn = step; return; } for(int i = 0;i < 4;i ++) //每一步有四个方向可以选择 { int nx = x + next[i][0]; int ny = y + next[i][1]; //下步的坐标。 if(nx <1 || nx > n || ny < 1 || ny > m) // 如果出界 continue; if(a[nx][ny] == 0 && book[nx][ny] == 0) //如果这个点不是障碍物,并且没有在路径中。 { book[nx][ny] = 1; //标记这个点 DFS(nx,ny,step + 1); //开始尝试下一个点 book[nx][ny] = 0; //尝试结束,取消这个点的标记,下面是换下一个方向 } } return; } int main() { cin>>n>>m; for(int i = 1;i <= n;i ++) { for(int j = 1;j <= m;j ++) { cin>>a[i][j]; } } cin>>sx>>sy>>ex>>ey; DFS(sx,sy,0); cout<<minn<<endl; return 0; }
BFS
#include <iostream> #include <algorithm> #include <queue> using namespace std; struct Note { int x; //横坐标 int y; //纵坐标 int s; //步数 }; Note N; queue<Note> q; int a[51][51]; //储存地图 int book[51][51] = {0}; int next[4][2] = {{0,1}, {1,0}, {0,-1}, {-1,0}}; int n,m; int sx,sy,ex,ey; int flag; int main() { int nx,ny;//下一个点的坐标 scanf("%d %d",&n,&m); for(int i = 1;i <= n;i ++) { for(int j = 1;j <= m;j ++) scanf("%d",&a[i][j]); } scanf("%d %d %d %d",&sx,&sy,&ex,&ey); N.x = sx; N.y = sy; N.s = 0; q.push(N);//先把起点加入队列中 book[sx][sy] = 1; //起点已经访问过 flag = 0; //标记是否到达目标点 while(!q.empty()) //当队列不为空的时候 { for(int i = 0;i < 3;i ++) //四个方向 { N.x = q.front().x + next[i][0]; N.y = q.front().y + next[i][1]; //新点的坐标 //判断是否越界 if(N.x < 1 || N.x > n || N.y < 1 || N.y > n) continue; //判断是否是障碍物或者已经再路径中 if(a[N.x][N.y] == 0 && book[N.x][N.y] == 0) { book[N.x][N.y] = 1; //新点加入到队列中 N.s = q.front().s + 1; q.push(N); } if(N.x == ex && N.y == ey) { flag = 1; break; } } if(flag == 1) break; q.pop(); //一个点的四个方向都判断过了,就删除队首,再进行扩展 } printf("%d\n",q.back().s); return 0; }