【题目描述】 去年秋天,奶牛们去参观了一个玉米迷宫,迷宫里有一些传送装置,可以将奶牛从一点到另一点进行瞬间转移。这些装置可以双向使用:一头奶牛可以从这个装置的起点立即到此装置的终点,同时也可以从终点出发,到达这个装置的起点。如果一头奶牛处在这个装置的起点或者终点,这头奶牛就必须使用这个装置。
玉米迷宫的外部完全被玉米田包围,除了唯一的一个出口。
这个迷宫可以表示为N*M的矩阵(2 <= N <= 300;2<=N<=300; 2 <= M <= 300;2<=M<=300),矩阵中的每个元素都由以下项目中的一项组成:玉米,这些格子是不可以通过的草地,可以简单的通过一个装置的结点,可以将一头奶牛传送到相对应的另一个结点出口。
奶牛仅可以在相邻两个格子之间移动,要在这两个格子不是由玉米组成的前提下才可以移动。奶牛能在一格草地上可能存在的四个相邻的格子移动。从草地移动到相邻的一个格子需要花费一个单位的时间,从装置的一个结点到另一个结点需要花费00个单位时间。
被填充为玉米的格子用'#'表示,草地用'.'表示,每一对装置的结点由相同的大写字母组成'A-Z',且没有两个不同装置的结点用同一个字母表示,出口用'='表示。
Bessie在这个迷宫中迷路了,她知道她在矩阵中的位置,将Bessie所在的那一块草地用'@'表示。求出Bessie需要移动到出口处的最短时间。 输入格式
第一行:两个用空格隔开的整数N和M;
第2至n+1行:第i+1行描述了迷宫中的第i行的情况(共有M个字符,每个字符中间没有空格。)
输出格式
一个整数,表示Bessie到达终点所需的最短时间。
#include <bits/stdc++.h>
using namespace std;
int n,m,sx,sy,ex,ey;
char ge[305][305];
bool v[305][305];
int fx[4]={1,-1,0,0},fy[4]={0,0,-1,1};
struct chuan
{
bool fj;
int ax,ay;
int bx,by;
};
chuan c[30];
struct Node
{
int x,y,step;
};
queue <Node> q;
int bfs()
{
q.push({sx,sy,0});
v[sx][sy]=true;
while (!q.empty())
{
Node f=q.front();
if (f.x==ex&&f.y==ey)
{
return f.step;
}
q.pop();
if (ge[f.x][f.y]>='A'&&ge[f.x][f.y]<='Z')
{
if (c[ge[f.x][f.y]-'A'+1].ax==f.x&&c[ge[f.x][f.y]-'A'+1].ay==f.y)
{
q.push({c[ge[f.x][f.y]-'A'+1].bx,c[ge[f.x][f.y]-'A'+1].by,f.step});
v[c[ge[f.x][f.y]-'A'+1].bx][c[ge[f.x][f.y]-'A'+1].by]=true;
}
else
{
q.push({c[ge[f.x][f.y]-'A'+1].ax,c[ge[f.x][f.y]-'A'+1].ay,f.step});
v[c[ge[f.x][f.y]-'A'+1].ax][c[ge[f.x][f.y]-'A'+1].ay]=true;
}
}
for (int i=0;i<=3;i++)
{
int tx=f.x+fx[i],ty=f.y+fy[i];
if (tx<1||tx>n||ty<1||ty>m||v[tx][ty]||ge[tx][ty]=='#')
{
continue;
}
q.push({tx,ty,f.step+1});
v[tx][ty]=true;
}
}
return -1;
}
int main()
{
cin>>n>>m;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
cin>>ge[i][j];
if (ge[i][j]=='=')
{
ex=i;
ey=j;
}
if (ge[i][j]=='@')
{
sx=i;
sy=j;
}
if (ge[i][j]>='A'&&ge[i][j]<='Z')
{
if (c[ge[i][j]-'A'+1].fj==true)
{
c[ge[i][j]-'A'+1].bx=i;
c[ge[i][j]-'A'+1].by=j;
}
else
{
c[ge[i][j]-'A'+1].ax=i;
c[ge[i][j]-'A'+1].ay=j;
c[ge[i][j]-'A'+1].fj=true;
}
}
}
}
cout<<bfs();
return 0;
}QAQ
看了CSDN与百度,找错找了1天半QAQ