zoukankan      html  css  js  c++  java
  • Wannafly挑战赛21 机器人

    从前在月球上有一个机器人。
    月球可以看作一个 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 #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 }
  • 相关阅读:
    软件工程概论之web基础
    java动手动脑——异常处理
    Java动手动脑——多态和继承
    java字串
    数据结构——用栈来判断回文字符串
    java一个能记录生成多少个对象的类
    openwrt设置默认登陆密码
    在ubuntu中安装luci解决iwinfo.h No such file or directory问题
    添加mysamba
    更改默认打开wifi功能
  • 原文地址:https://www.cnblogs.com/tingtin/p/9459355.html
Copyright © 2011-2022 走看看