救小Q(简单传送门)

题意:在一幅图中,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

Submit

Status

Best Solution

Back

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值