注意反数组和dx与dy数组应对应
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#define inf 1e9
using namespace std;
const int maxm=100010;
const int maxn=35;
const int dx[5]={0,1,0,-1,0};
const int dy[5]={0,0,1,0,-1};
const int fan[5]={0,3,4,1,2};
int headd[maxm*2],nnext[maxm*2],to[maxm*2],length[maxm*2];
int tot,n,m,q,no=0;
int map[maxn][maxn];
int step[maxn][maxn];
int num[maxn][maxn][5];
int dis[maxm];
struct zb
{
int x;
int y;
};
void add(int x,int y,int l)
{
tot++;
nnext[tot]=headd[x];
headd[x]=tot;
to[tot]=y;
length[tot]=l;
}
int bfs(int sx,int sy,int tx,int ty)
{
if(sx==tx&&sy==ty) return 0;
struct zb team[maxm];
int head=0,tail=0;
struct zb S,T;
S.x=sx, S.y=sy, T.x=tx, T.y=ty;
bool b[maxn][maxn];
memset(b,false,sizeof(b));
memset(step,0,sizeof(step));
b[S.x][S.y]=true;
team[++tail]=S;
while(head<tail)
{
struct zb x=team[++head];
// cout<<x.x<<' '<<x.y<<endl;
for(int i=1;i<=4;i++)
{
struct zb tmp;
tmp.x=x.x+dx[i];
tmp.y=x.y+dy[i];
if(!b[tmp.x][tmp.y]&&map[tmp.x][tmp.y]==1)
{
step[tmp.x][tmp.y]=step[x.x][x.y]+1;
if(tmp.x==tx&&tmp.y==ty) return step[tmp.x][tmp.y];
b[tmp.x][tmp.y]=true;
team[++tail]=tmp;
}
}
}
return inf;
}
void beginning()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(map[i][j]==1)
{
for(int w=1;w<=4;w++)
{
if(map[i+dx[w]][j+dy[w]]==1)
{
for(int k=1;k<=4;k++)
{
if(map[i+dx[k]][j+dy[k]]==1&&w!=k)
{
map[i][j]=0;
int tmp=bfs(i+dx[w],j+dy[w],i+dx[k],j+dy[k]);
if(tmp!=inf) add(num[i][j][w],num[i][j][k],tmp);
map[i][j]=1;
}
}
}
}
}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(map[i][j]==1)
for(int w=1;w<=4;w++)
if(map[i+dx[w]][j+dy[w]]==1)
add(num[i][j][w],num[i+dx[w]][j+dy[w]][fan[w]],1);
}
void spfa(int s,int t)
{
int team[maxm],head=0,tail=0;
bool b[maxm];
memset(b,false,sizeof(b));
for(int i=1;i<=no;i++) dis[i]=inf;
dis[s]=0;
b[s]=true;
team[++tail]=s;
while(head<tail)
{
int now=team[++head];
b[now]=false;
for(int i=headd[now];i;i=nnext[i])
{
int y=to[i];
if(dis[y]>dis[now]+length[i])
{
dis[y]=dis[now]+length[i];
if(!b[y])
{
b[y]=true;
team[++tail]=y;
}
}
}
}
if(dis[t]==inf) cout<<"-1"<<endl;
else printf("%d\n",dis[t]);
}
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int w=1;w<=4;w++)
num[i][j][w]=++no;
beginning();
for(int ex,ey,sx,sy,tx,ty,i=1;i<=q;i++)
{
scanf("%d%d%d%d%d%d",&ex,&ey,&sx,&sy,&tx,&ty);
if(sx==tx&&sy==ty)
{
cout<<"0"<<endl;
continue;
}
if(map[ex][ey]==0||map[sx][sy]==0||map[tx][ty]==0)
{
cout<<"-1"<<endl;
continue;
}
int s=++no,t=++no;
for(int j=1;j<=4;j++)
{
if(map[sx+dx[j]][sy+dy[j]]==1)
{
map[sx][sy]=0;
int tmp=bfs(ex,ey,sx+dx[j],sy+dy[j]);
//cout<<j<<"*"<<tmp<<endl;
if(tmp!=inf) add(s,num[sx][sy][j],tmp);
map[sx][sy]=1;
}
}
for(int j=1;j<=4;j++)
{
if(map[tx+dx[j]][ty+dy[j]]==1)
{
add(num[tx][ty][j],t,0);
}
}
spfa(s,t);
}
return 0;
}

本文介绍了一种基于迷宫地图的寻路算法实现方法,通过建立图模型并使用宽度优先搜索(BFS)和最短路径算法SPFA来解决起点到终点的最短路径问题。文章详细解释了如何构建节点连接、如何处理特殊场景,并提供了完整的C++代码示例。
776

被折叠的 条评论
为什么被折叠?



