链接:https://www.nowcoder.com/acm/contest/159/B
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
从前在月球上有一个机器人。
月球可以看作一个 n*m 的网格图,每个格子有三种可能:空地,障碍,机器人(有且仅有一个),现在地面指挥中心想让机器人在月球上行走,每次可以发送一个指令,为 U-往上走、D-往下走、L-往左走、R-往右走的其中之一。
当机器人接收到一个行走指令时,如果即将到达的位置为障碍物,那么机器人将留在原地,否则机器人向对应方向走一步,如果其走出边界那么立即死亡。
地面指挥中心当然不想让机器人就这么挂掉,因此其定义一个操作序列是安全的,当且仅当机器人按此操作序列走不会死亡。
但是从地球向月球发信息不是个容易的事,而且有时候某些指令还会在茫茫宇宙中被吞没,比如指挥中心传出去 RUR 指令,到机器人那里就可能变成 RR 或者变成 U,因此定义一个操作序列是绝对安全的当且仅当其任意子序列都是安全的。
现在地面指挥中心想知道,对于某一个地图,绝对安全的操作序列最长可以到多少,如果存在一个长度为正无穷的这样的序列,那么输出-1。
输入描述:
第一行一个正整数T,表示数据组数。
接下来一共 T 组数据,每组数据第一行有两个正整数 n,m,表示网格图的大小, 接下来 n 行,每行 m 个字符,表示这张网格图。
其中字符“.”表示空地,“#”表示障碍物,“S”表示机器人所在位置。
输出描述:
一共 T 行,每行一个整数,表示答案。
示例1
输入
复制
3
5 5
#####
#...#
.#S#.
#...#
#####
1 7
S......
5 8
#.######
#.#..S.#
#.#.##.#
#......#
########
输出
复制
-1
6
-1
备注:
数据范围 0≤T,n,m≤50
思路:
当上下左右方向上有一个障碍物则输出-1
反之:
设起点坐标(sx,sy),则左边有sy-1格,右边有m-sy格,上有sx-1格,下有n-sx格
水平方向,向左最多走sy-1格,最坏的情况,这sy-1格都丢了,我们向右还能走m-sy格,若这m-sy格还丢了,我们此时位置还在原点,竖直方向也是,向上最多sx-1,向下最多n-sx,一共是sy-1+m-sy+sx-1+n-sx=n+m-2
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int n,m,sx,sy,gx,gy;
int dx[]={0,1,0,-1},dy[]={-1,0,1,0};
char mape[55][55],ch;
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
getchar();
memset(mape,0,sizeof(mape));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%c",&ch);
if(ch=='S'){
sx=i;sy=j;
}
mape[i][j]=ch;
}
getchar();
}
int flag=0;
for(int i=0;i<m;i++){
if(mape[sx][i]=='#'){
flag=1;
break;
}
}
if(flag){
printf("-1\n");
continue;
}
for(int i=0;i<n;i++){
if(mape[i][sy]=='#'){
flag=1;
break;
}
}
if(flag){
printf("-1\n");
continue;
}
printf("%d\n",n+m-2);
}
}