NC21444. 寻找最后之作
描述
总计230万人,其中学生占80%的学园都市,所有学生必须接受超能力开发。在领土方面,分为23个学区,每个学区有其不同职能。学园都市并无常备武装力量,甚至不存在警察。取而代之的是从学生中挑选出的风纪委员(Judgement)和教师自愿参与的警备员(Anti-Skill)维护治安,甚至可以组织成对外打击军队。其科技高度发达,领先于外域大约20至30年,高度的科学技术不仅使其合作组织遍布世界各地,为了防止外部势力渗透、科学技术流失、学园都市对人口出入进行严格的管制。
在学园都市内,众所周知,有一位白发苍苍,行动不便的老人,由于他只能拄着拐杖慢慢行走,连回头都十分不方便,所以大家都叫他“一方通行”,不过好在一直有一个可爱的小女孩——最后之作(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; }