从前在月球上有一个机器人。
月球可以看作一个 n*m 的网格图,每个格子有三种可能:空地,障碍,机器人(有且仅有一个),现在地面指挥中心想让机器人在月球上行走,每次可以发送一个指令,为 U-往上走、D-往下走、L-往左走、R-往右走的其中之一。
当机器人接收到一个行走指令时,如果即将到达的位置为障碍物,那么机器人将留在原地,否则机器人向对应方向走一步,如果其走出边界那么立即死亡。
地面指挥中心当然不想让机器人就这么挂掉,因此其定义一个操作序列是安全的,当且仅当机器人按此操作序列走不会死亡。
但是从地球向月球发信息不是个容易的事,而且有时候某些指令还会在茫茫宇宙中被吞没,比如指挥中心传出去 RUR 指令,到机器人那里就可能变成 RR 或者变成 U,因此定义一个操作序列是绝对安全的当且仅当其任意子序列都是安全的。
现在地面指挥中心想知道,对于某一个地图,绝对安全的操作序列最长可以到多少,如果存在一个长度为正无穷的这样的序列,那么输出-1。
月球可以看作一个 n*m 的网格图,每个格子有三种可能:空地,障碍,机器人(有且仅有一个),现在地面指挥中心想让机器人在月球上行走,每次可以发送一个指令,为 U-往上走、D-往下走、L-往左走、R-往右走的其中之一。
当机器人接收到一个行走指令时,如果即将到达的位置为障碍物,那么机器人将留在原地,否则机器人向对应方向走一步,如果其走出边界那么立即死亡。
地面指挥中心当然不想让机器人就这么挂掉,因此其定义一个操作序列是安全的,当且仅当机器人按此操作序列走不会死亡。
但是从地球向月球发信息不是个容易的事,而且有时候某些指令还会在茫茫宇宙中被吞没,比如指挥中心传出去 RUR 指令,到机器人那里就可能变成 RR 或者变成 U,因此定义一个操作序列是绝对安全的当且仅当其任意子序列都是安全的。
现在地面指挥中心想知道,对于某一个地图,绝对安全的操作序列最长可以到多少,如果存在一个长度为正无穷的这样的序列,那么输出-1。
输入描述:
第一行一个正整数T,表示数据组数。
接下来一共 T 组数据,每组数据第一行有两个正整数 n,m,表示网格图的大小, 接下来 n 行,每行 m 个字符,表示这张网格图。
其中字符“.”表示空地,“#”表示障碍物,“S”表示机器人所在位置。
输出描述:
一共 T 行,每行一个整数,表示答案。
示例1
备注:
数据范围 0≤T,n,m≤50
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstdlib> 5 #include <cstring> 6 using namespace std; 7 #define ll long long 8 #define N 60 9 #define gep(i,a,b) for(int i=a;i<=b;i++) 10 #define mem(a,b) memset(a,b,sizeof(a)) 11 char s[N][N]; 12 int t,n,m; 13 int dir[4][2]={0,1,0,-1,1,0,-1,0}; 14 /* 15 只要四个方向有一个方向有#,就是正无穷大,因为遇到#会停止,它的 16 任何子序列也都是安全的 17 否则(四个方向全是.) 18 答案就是(n-1)+(m-1) 19 它的子序列也都是安全的。 20 */ 21 int main() 22 { 23 scanf("%d",&t); 24 while(t--) 25 { 26 mem(s,0); 27 int x,y; 28 scanf("%d%d",&n,&m); 29 gep(i,0,n-1){ 30 scanf("%s",s[i]); 31 gep(j,0,m-1){ 32 if(s[i][j]=='S') x=i,y=j; 33 } 34 } 35 bool flag=1; 36 gep(i,0,3){ 37 int xx=x,yy=y; 38 for(int j=0;xx>=0&&xx<n&&yy>=0&&yy<m;j++){ 39 xx+=dir[i][0]; 40 yy+=dir[i][1]; 41 if(s[xx][yy]=='#'){ 42 43 flag=0; 44 break; 45 } 46 } 47 if(!flag) break; 48 } 49 if(!flag) printf("-1 "); 50 else{ 51 printf("%d ",n+m-2); 52 } 53 } 54 return 0; 55 }