代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
char e[N][N];
int vx[N][N],vy[N][N],book[N][N];
int to[4][2]={0,1,0,-1,1,0,-1,0};
int n,m,st,et;
struct Node{
int x,y,s;
};
int bfs(int x,int y)
{
int gx,gy,flag,tx,ty,i;
queue<Node> Q;
struct Node u,v;
memset(book,0,sizeof(book));
v.x=x;
v.y=y;
v.s=0;
book[x][y]=1;
Q.push(v);
while(!Q.empty())
{
u=Q.front();
Q.pop();
if(u.x==st&&u.y==et) return u.s;
tx=vx[u.x][u.y];
ty=vy[u.x][u.y];
if(tx!=0&&ty!=0)
{
if(tx<1||tx>n||ty<1||ty>m) continue;
if(book[tx][ty]) continue;
if(e[tx][ty]=='*') continue;
book[tx][ty]=1;
v.x=tx;
v.y=ty;
v.s=u.s;
Q.push(v);
}
else
{
for(i=0;i<4;i++)
{
tx=u.x+to[i][0];
ty=u.y+to[i][1];
if(tx<1||tx>n||ty<1||ty>m) continue;
if(book[tx][ty]) continue;
if(e[tx][ty]=='*') continue;
book[tx][ty]=1;
v.x=tx;
v.y=ty;
v.s=u.s+1;
Q.push(v);
}
}
}
return -1;
}
int main()
{
int i,q,a,b,c,d,t;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
scanf("%s",e[i]+1);
scanf("%d",&q);
memset(vx,0,sizeof(vx));
memset(vy,0,sizeof(vy));
while(q--)
{
scanf("%d %d %d %d",&a,&b,&c,&d);
vx[a][b]=c;
vy[a][b]=d;
}
scanf("%d %d",&st,&et);
t=bfs(1,1);
if(e[1][1]=='*') t=-1;
if(t>=0)
printf("%d\n",t);
else
printf("No solution\n");
return 0;
}
/*
传送点不可以自己传自己,死循环
传送点不可以传到某点后再传到自己,死循环
这些用book标记即可,每个点最多传送一次
*/