鏈接: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
思路:設S位置爲(x,y),如果S的上下左右只要有一個#,往這個方向走一定是-1;否則就是上下左右之和即m+n-2;
代碼:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char G[55][55];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
int x,y;
int flag=0;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;++j)
{
cin>>G[i][j];
if(G[i][j]=='S') x=i,y=j;
}
for(int i=0;i<n;i++)
if(G[i][y]=='#') {flag=1;break;}
for(int i=0;i<m;+i++)
if(G[x][i]=='#') {flag=1;break;}
if(flag==1) printf("-1\n");
else printf("%d\n",n+m-2);
}
//return 0;
}