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 }
  • 相关阅读:
    LeetCode 515. 在每个树行中找最大值(Find Largest Value in Each Tree Row)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 1022. 从根到叶的二进制数之和(Sum of Root To Leaf Binary Numbers)
    LeetCode 897. 递增顺序查找树(Increasing Order Search Tree)
    LeetCode 617. 合并二叉树(Merge Two Binary Trees)
    LeetCode 206. 反转链表(Reverse Linked List) 16
    LeetCode 104. 二叉树的最大深度(Maximum Depth of Binary Tree)
    LeetCode 110. 平衡二叉树(Balanced Binary Tree) 15
    LeetCode 108. 将有序数组转换为二叉搜索树(Convert Sorted Array to Binary Search Tree) 14
  • 原文地址:https://www.cnblogs.com/tingtin/p/9459355.html
Copyright © 2011-2022 走看看