dfs和bfs走迷宫

数据

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值