题意:在一幅图中,L要找到Q,#为陷阱,,有各种小写的一对字母为传送门。
求其能找到Q的最短距离
思路:就是简单的广搜,不过要注意:要该点找到传送门后只把该点标记为已经访问,
如果把传送门的另一端也标为巳访问则会WA,因为标记后,会使另外的传送门从这边过来就不行了。
#include<iostream>
#include<cstdio>
#include<queue>
#include<ctype.h>
#include<cstring>
using namespace std;
int n,m;
char map[66][66];
struct my
{
int x1,y1,x2,y2;
}men[34];
struct car
{
int x,y;
int step;
};
int a[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int startx,starty;
int aimx,aimy;
bool visit[55][55];
bool in(int x,int y)
{
return x>=0 && x<n && y>=0 && y<m;
}
bool bfs()
{
car cur;
queue<car> q;
cur.x=startx;
cur.y=starty;
cur.step=0;
q.push(cur);
memset(visit,false,sizeof(visit));
visit[startx][starty]=true;
while (!q.empty())
{
car d=q.front();
//cout<<d.x<<' '<<d.y<<' '<<d.step<<endl;
q.pop();
if (map[d.x][d.y]=='Q')
{
printf("%d\n",d.step);
return false;
}
for (int i=0;i<4;i++)
{
int x=d.x+a[i][0];
int y=d.y+a[i][1];
if (in(x,y) && map[x][y]!='#' && !visit[x][y])
{
// cout<<x<<' '<<y<<endl;
if (map[x][y]>='a' && map[x][y]<='z')
{
if (men[map[x][y]-'a'].x1==x && men[map[x][y]-'a'].y1==y)
{
cur.x=men[map[x][y]-'a'].x2;
cur.y=men[map[x][y]-'a'].y2;
}
else
{
cur.x=men[map[x][y]-'a'].x1;
cur.y=men[map[x][y]-'a'].y1;
}
//visit[cur.x][cur.y]=true;//这里加了就要WA
cur.step=d.step+1;
q.push(cur);
}
else
{
cur.x=x;
cur.y=y;
cur.step=d.step+1;
q.push(cur);
}
visit[x][y]=true;
}
}
}
return true;
}
int main()
{
freopen("in.txt","r",stdin);
int i,j,k;
int nc;
cin>>nc;
while (nc--)
{
for (i=0;i<27;i++)
men[i].x1=-1;
cin>>n>>m;
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
cin>>map[i][j];
// cout<<map[i][j];
if (map[i][j]=='L')
startx=i,starty=j;
else if (map[i][j]>='a' && map[i][j]<='z')
{
if (men[map[i][j]-'a'].x1==-1 )
{
// cout<<map[i][j]-'a'<<endl;
men[map[i][j]-'a'].x1=i;
men[map[i][j]-'a'].y1=j;
}
else
{
men[map[i][j]-'a'].x2=i;
men[map[i][j]-'a'].y2=j;
}
}
}
}
if (bfs())
{
puts("-1");
}
}
return 0;
}
解救小Q
Time Limit: 1000 ms Memory Limit: 65535 kB Solved: 310 Tried: 2849
Description
小Q被邪恶的大魔王困在了迷宫里,love8909决定去解救她。
迷宫里面有一些陷阱,一旦走到陷阱里,就会被困身亡:(,迷宫
里还有一些古老的传送阵,一旦走到传送阵上,会强制被传送到
传送阵的另一头。
现在请你帮助love8909算一算,他至少需要走多少步才能解
救到小Q?
Input
第一行为一个整数T,表示测试数据组数。
每组测试数据第一行为两个整数N,M,(1 <= N, M <= 50)表示
迷宫的长和宽。
接下来有N行,每行M个字符,是迷宫的具体描述。
'.'表示安全的位置,'#'表示陷阱,
'Q'表示小Q的位置,'L'表示love8909所在位置,
数据保证love8909只有一个,数据也保证小Q只有一个。
小写字母'a'-'z'表示分别表示不同的传送阵,数据保证传送阵
两两配对。
Output
每组数据输出一行,解救小Q所需的最少步数,如果无论如何都
无法救小Q,输出-1。
Sample Input
2
5 5
....L
.###.
b#b#a
##.##
...Qa
5 5
....L
.###.
.#.#.
##.##
...Q.
Sample Output
3
-1