迷宫最短路径DFS与BFS

给定一个大小为NxM的迷宫。迷宫有通道和墙壁组成每一步可以向邻接的上下左右四格的通道移动。请求出起点到终点所需的最小步数。*表示障碍物,.表示可以通道。本题假定从起点一定可以移动到终点。

限制条件:

N,M《 100.

 

样例

输入

5 5

.....

.*.*.

.*S*.

.***.

...T*

2 2 4 3

输出

11

 

BFS解法:

#include<stdio.h>
#include<queue>
using namespace std;

char maze[101][101];
int n,m;

typedef struct node
{
    int x,y;//位置(x,y)
    int step;//从起点到达某位置需要的最少步数
}node;
node Start,End,temp,top;
int a[4]={0,0,1,-1};//表示上下左右位移
int b[4]={1,-1,0,0};//
int flag[101][101]={false};//记录某个位置是否已入过队列

int BFS()
{
    queue<node> que;
    que.push(Start);
    while(!que.empty())
    {
        top=que.front();
        que.pop();
        if(top.x==End.x&&top.y==End.y)
            return top.step;
        for(int i=0;i<4;i++)
        {
            int curx=top.x+a[i];
            int cury=top.y+b[i];
            if(curx>=0&&curx<n&&cury>=0&&cury<m&&maze[curx][cury]!='*'&&flag[curx][cury]==false)//注意不能等于m 等于的话就越界了
            {
                temp.x=curx;
                temp.y=cury;
                temp.step=top.step+1;
                que.push(temp);
                flag[curx][cury]=true;
            }
        }
    }
    return -1;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        getchar();
        for(int j=0;j<m;j++)
        {
            scanf("%c",&maze[i][j]);
        }
        maze[i][m+1]='\0';
    }
    scanf("%d%d%d%d",&Start.x,&Start.y,&End.x,&End.y);
    Start.step=0;
    printf("%d\n",BFS());

   return 0;

}

DFS解法:

#include<stdio.h>
 
char maze[100][100];
int startX,startY,endX,endY,n,m;
int flag[100][100];
int move[4][2] = {{-1,0},{0,-1},{1,0},{0,1}};
int step;
int ans = 100000;
 
void dfs(int x,int y,int step)
{
	if(maze[x][y] == 'T')
	{
		if(step<ans)
		{
			ans = step;
		}
		return; 
	}
	
	for(int i=0;i<4;i++)
	{
		int curx = x + move[i][0];
		int cury = y + move[i][1];
		if(curx>=0&&curx<n&&cury>=0&&cury<m&&flag[curx][cury]==false&&maze[curx][cury]!='*')
		{
			flag[curx][cury] = true;
			dfs(curx,cury,step+1);
			flag[curx][cury] = false;
		} 
	}
} 
 
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++) scanf("%s",&maze[i]);
    scanf("%d%d%d%d",&startX,&startY,&endX,&endY);
    dfs(startX,startY,0);
    printf("%d",ans);
    
    return 0;
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值