SCU-4396 麦野沉利与御坂美琴的战斗

4396: 麦野沉利与御坂美琴的战斗

Submit your solution     Discuss this problem     Best solutions

描述

麦姐辛苦建立的实验室被入侵了,而且入侵者已经到达最后一个。但是这个入侵者居然是level5的御坂美琴!!但是同为level5的麦姐怎么能退缩呢!!

御坂美琴是学园都市名门贵族女校常盘台中学二年级生,有着一头及肩的茶色发丝、同样是茶色的瞳孔。同时她也是学院都市排名第三位的超能力者。能力名为“超电磁炮”,能够随意操纵十亿伏特高压电流、电磁波和磁力。 作为item组织的头头,自己的实验室被偷袭,为了保护好自己的部下。必须殊死搏斗。

根据同伴芙兰达的情报,麦姐发现整个实验室包含了n*m个房间,如下图
######
#p***#
###**#
#m***#
###**#
其中#表示该房间已经被可恶的御坂美琴给破坏了,不能通过;
而*表示还完好的房间。
p则表示御坂美琴现在的位置,m表示麦姐现在的位置。
麦姐每次都可以向四周移动一个房间,当然她不会离开实验室。
现在麦姐必须尽快赶到御坂美琴所在的房间,击溃她!
大战之前,麦姐必须把全部精力用来战斗,现在请你帮助麦姐计算一下她最少需要移动几个房间才能到御坂美琴的房间。

Input

第一行一个整数T,代表样例总数。
之后每组数据格式为
第一行为n m,表示实验室的大小(n, m小于等于200大于0)
之后的n行表示整个实验室的地图。

Output

对于每组样例,输出一个整数F代表麦姐最少需要走多少个房间,如果没有道路通向炮姐所在房间,输出-1。

Example Input

2
5 5
m****
**#**
**#**
*#***
**#p*
10 10
********#*
**#*******
#*#*#*****
*##*#*****
#**#***#**
****#***#*
#**m*#****
*****#p***
#*********
***#*##***

Example Output

7
6

Author

qw4990
一道求最短路径的题,毫无悬念用BFS了。先创建二维字符数组存数据,扫描到字母m或p就记录当前坐标,分别表示起点和终点,创建一个int类型的step[maxn][maxn]数组并初始化为0,一个bool类型的visit数组用来存储当前地图点是否被访问过的数据。数据读入完成后开始BFS,起点为字母m所在地,每次有四种走法,每开始一种走法,判断是否撞墙(房屋被毁),如果撞墙则不能走,如果没有撞墙且坐标合法(不要跑到地图外去了)

next.x >= 0 && next.x< N && next.y >= 0 && next.y< M
则判断目前是不是到了终点,如果到达终点,输出step数组中对应的值,否则加入队列,继续下一次搜索,函数执行完成后,如果终点是可以到达的,那么step一定不为零,反之step为零,最终输出结果加一个判断条件如果步数为0则输出-1,否则输出所需最短步数即可。

#include<iostream>
#include<cstring>
#include<queue>
#define MAX 200+5
using namespace std;
struct node
{
	int x, y;
};
char maze[MAX][MAX + 1] = { 0 };
bool visit[MAX][MAX + 1] = { false };
int step[MAX][MAX + 1] = { 0 };
int dir[4][2] = { { -1,0 },{ 1,0 },{ 0,-1 },{ 0,1 } };
int sx, sy, ex, ey;
int N, M;
queue <node> que;
void BFS(int x, int y)
{
	node q;
	q.x = x; q.y = y;
	que.push(q);
	while (!que.empty())
	{
		node now = que.front();
		node next;
		que.pop();
		for (int i = 0; i<4; i++)
		{
			next.x = now.x + dir[i][0];
			next.y = now.y + dir[i][1];
			if (next.x >= 0 && next.x< N && next.y >= 0 && next.y< M && maze[next.x][next.y] != '#' && visit[next.x][next.y] == false)
			{
				visit[next.x][next.y] = true;
				step[next.x][next.y] = step[now.x][now.y] + 1;
				que.push(next);
			}
		}
	}
}
int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        while(cin >>N >> M)
        {
            memset(maze,0,sizeof(maze));
            memset(step,0,sizeof(step));
            memset(visit,false,sizeof(visit));
            for (int i = 0; i<N; i++)
                for (int j = 0; j<M; j++)
                    {
                        cin >> maze[i][j];
                        if (maze[i][j]=='p')
                        {
                            ex=i;ey=j;
                        }
                    }
            for (int i = 0; i<N; i++)
                for (int j = 0; j<M; j++)
                {
                    if (maze[i][j] == 'm')
                        {
                            BFS(i,j);
                            if(step[ex][ey]!=0)    cout << step[ex][ey] << endl;
                            else cout << "-1" << endl;
                        }
                }
        }
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值