数据
10 10 //格子行 列
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
0 1 //起点
9 8 //终点
输出
22
dfs代码:
#include <stdio.h>
#define maxn 10001
#define INF 100001
int n,m;
char maze[maxn][maxn];
int d[maxn][maxn];
int sx,sy,gx,gy;
int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};
int dfs(int x,int y)
{
if(x==gx&&y==gy)return d[x][y]; //递归边界 走到终点
for(int i=0;i<4;i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&d[nx][ny]==INF
&&maze[nx][ny]!='#'&&d[gx][gy]==INF) //也要加个终点没有被访问到过,
{ //不然,当走到终点,依旧会递归,直到全部格子走过一遍
d[nx][ny]=d[x][y]+1;
printf("当前位置:%d %d 移动步数%d \n",nx,ny,d[nx][ny]);
dfs(nx,ny);
}
}
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",&maze[i]);
scanf("%d %d %d %d",&sx,&sy,&gx,&gy);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
d[i][j]=INF;
d[sx][sy]=0;
dfs(sx,sy);
printf("%d",d[gx][gy]);
return 0;
}
bfs代码:
#include <stdio.h>
#include <utility>
#include <queue>
#define maxn 10001
#define INF 1000000
using namespace std;
typedef pair<int, int>P;
char maze[maxn][maxn];
int sx,sy;
int gx,gy;
int n,m;
int d[maxn][maxn];
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int bfs()
{
queue<P>s;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
d[i][j]=INF;
s.push(P(sx,sy));
d[sx][sy]=0;
while(s.size())
{
P p=s.front();s.pop();
if(p.first==gx&&p.second==gy)break;
for(int i=0;i<4;i++)
{
int nx=p.first+dx[i];int ny=p.second+dy[i];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&d[nx][ny]==INF&&maze[nx][ny]!='#')
{
s.push(P(nx,ny));
d[nx][ny]=d[p.first][p.second]+1;
}
}
}
return d[gx][gy];
}
int main()
{
int i,j;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
scanf("%s",&maze[i]);
scanf("%d %d %d %d",&sx,&sy,&gx,&gy);
printf("%d",bfs());
return 0;
}