描述:
给出迷宫,起点和终点,求出起点到终点的最短距离,(只能上下左右走,一格距离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;
}