列表

详情


NC21444. 寻找最后之作

描述

总计230万人,其中学生占80%的学园都市,所有学生必须接受超能力开发。在领土方面,分为23个学区,每个学区有其不同职能。学园都市并无常备武装力量,甚至不存在警察。取而代之的是从学生中挑选出的风纪委员(Judgement)和教师自愿参与的警备员(Anti-Skill)维护治安,甚至可以组织成对外打击军队。其科技高度发达,领先于外域大约2030年,高度的科学技术不仅使其合作组织遍布世界各地,为了防止外部势力渗透、科学技术流失、学园都市对人口出入进行严格的管制。

在学园都市内,众所周知,有一位白发苍苍,行动不便的老人,由于他只能拄着拐杖慢慢行走,连回头都十分不方便,所以大家都叫他“一方通行”,不过好在一直有一个可爱的小女孩——最后之作(Last Order)陪在他身边,他的晚年生活不再寂寞,而是充满了色彩。

但是有一天,在他们出门散步的时候,“我的肚子饿了,想吃冰淇淋啦!御坂御坂摸着自己的肚子,渴望地盯着你说道”,小女孩就跑掉了,老人非常着急,你能帮他找到正确的道路,尽快追上最后之作吗?

输入描述

第一行是一个正整数T,代表输入数据的组数。每组数据的第一行有两个正整数,m,n。m为地图的长度,n为地图的宽度(m,n<=100)。接下来的m行中,每行为一个长度为n的字符串,“.”表示可以通行,“#”表示不可以通行,“A”为一方通行所在地,“L”为最后之作所在地。每一步可以有八个方向(上、下、左、右、左上、左下、右上、右下)。

输出描述

对于每组输入数据,如果最后可以找到最后之作,输出一个整数,为消耗的最小步数,如果无法到达,输出“I Need Move Point”(有空格,没有引号)。

示例1

输入:

2
3 3
A##
..#
#.L
1 4
A.#L

输出:

2
I Need Move Point

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 4ms, 内存消耗: 1060K, 提交时间: 2023-07-17 21:06:06

#include<bits/stdc++.h>

using namespace std;

int x,y,n,m,vis[409][409];
int fa[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,-1},{-1,1}};

char Map[509][509];
struct cs
{
	int x,y,add;
 };

void bfs()
{
	int i;
	cs a,b;
	a.add=0;
	a.x=x;
	a.y=y;
	queue<cs>ma;
	ma.push(a);
	vis[x][y]=1;
	while(!ma.empty())
	{
		a=ma.front();
		ma.pop();
        if(Map[a.x][a.y]=='L')
	    {
		cout<<a.add<<endl;
		return ;
	    }
		for(i=0;i<8;i++)
		{
				b.x=a.x+fa[i][0];
				b.y=a.y+fa[i][1];
				b.add=a.add+1;
			if(Map[b.x][b.y]!='#'&&b.x>0&&b.y>0&&b.x<=n&&b.y<=m&&vis[b.x][b.y]!=1)
			{
				ma.push(b);
				vis[b.x][b.y]=1;
			}
		}
	}
	cout<<"I Need Move Point\n";
	return ;
}
int main()
{
    int i,j,t;
    cin>>t;
    while(t--)
    {
    memset(vis,0,sizeof(vis));
    cin>>n>>m;
    getchar();
    for(i=1;i<=n;i++)
    {
    	for(j=1;j<=m;j++)
    	{
    	cin>>Map[i][j];
		if(Map[i][j]=='A')
		{
			x=i;
			y=j;
		}
		}
		getchar();
	}
    bfs();
	}
	return 0;
}

上一题