8

本文介绍了一种使用SPFA算法求解迷宫中从起点到终点最短路径的方法。通过定义节点结构体和方向数组,利用队列进行广度优先搜索,实现了对每个格子的访问状态记录及最短步数更新。该算法考虑了障碍物的存在,并对其通过成本进行了特殊设置。
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<queue>
#define MAX 210
using namespace std;
char map[MAX][MAX];
bool visit[MAX][MAX];
int dir[2][4]={{0,0,1,-1},{1,-1,0,0}};
int step[MAX][MAX];
int m,n,s,t;
struct node
{
    int x,y;
    bool ok()
    {
        if(0<=x&&x<m&&0<=y&&y<n)
          return true;
        return false;
    }
};
int spfa()
{
    int i,j;
    node u,v;
    u.x=0;
    u.y=0;
    memset(step,-1,sizeof(step));
    memset(visit,0,sizeof(visit));
    queue<node>q;
    q.push(u);
    visit[0][0]=true;
    step[0][0]=0;
    while(!q.empty())
    {
        u=q.front();
        q.pop();
        visit[u.x][u.y]=0;
        for(i=0;i<4;i++)
        {
            v.x=u.x+dir[0][i];
            v.y=u.y+dir[1][i];
            if(v.ok())
            {
                if(step[v.x][v.y]>step[u.x][u.y]+(map[v.x][v.y]=='#'?4:1)||step[v.x][v.y]==-1)
                {
                    step[v.x][v.y]=step[u.x][u.y]+(map[v.x][v.y]=='#'?4:1);
                    if(!visit[v.x][v.y])
                    {
                        q.push(v);
                        visit[v.x][v.y]=1;
                    }
                }
            }
        }
    }
    return step[s-1][t-1];
}
int main()
{
    int i,j;
    while(~scanf("%d%d",&m,&n))
    {
        for(i=0;i<m;i++)
          scanf("%s",map[i]);
        scanf("%d%d",&s,&t);
        printf("%d\n",spfa());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值