Save The Princess

最近阿宅迷上了一款二次元游戏叫<<解救公主>>。

其中有一关的规则是这样的

公主被困在梦境里,梦境里的空间无限大,公主靠自己是走不出来的。

系统会随机很多条行动指令,玩家必须帮公主选出正确的指令,公主按照玩家选择的指令,重复执行若干次后就能走出困境。

指令有三个字符组成 S,R,L

S: 前进一步
R: 向右转
L: 向左转
如果公主重复执行错误的指令,她就会一直在绕圈子,走不出梦境。

所谓“绕圈子”是指:无论公主重复执行多少次指令,她始终都在一个以出发点为圆心,以R为半径的圆里,永远走不出这个圆,更走不出梦境。

阿宅已经卡在这一关很久了。他很痛苦不能早日拯救公主脱离苦海,于是向聪明的你求助,让你写段代码判断哪些指令是正确的,哪些指令是错误的。

输入:

第一行 一个整数n

之后共有n行,每行为一个指令串

输入约束:

n位于区间[1,50]

从第二行开始,每行指令串长度为1-50,且仅包含字母 S,L,R

输出:

仅有一个单词。

指令串错误 打印 no

指令串正确 打印 yes

举例1:

输入

1
SLSR
输出

yes
解释:假设公主初始状态向北,公主的行动序列依次为前进,左转,前进,右转,此时公主仍然向北,但位置已经移动了。只要时间足够长,公主会一直向这个方向前进,所以公主没有在绕圈子。她能走出梦境,指令是正确的

举例2:

输入

2
SSSS
R
输出

no
解释: 公主一直在沿着一个边长为4步的小正方形绕圈子,指令是错误的

import java.util.Scanner;

public class SaveThePrincess
{

  public static void main(String[] args)
  {
    /**
     * 最近阿宅迷上了一款二次元游戏叫<<解救公主>>。
     * 
     * 其中有一关的规则是这样的
     * 
     * 公主被困在梦境里,梦境里的空间无限大,公主靠自己是走不出来的。
     * 
     * 系统会随机很多条行动指令,玩家必须帮公主选出正确的指令,公主按照玩家选择的指令,重复执行若干次后就能走出困境。
     * 
     * 指令有三个字符组成 S,R,L
     * 
     * S: 前进一步
     * R: 向右转
     * L: 向左转
     * 如果公主重复执行错误的指令,她就会一直在绕圈子,走不出梦境。
     * 
     * 所谓“绕圈子”是指:无论公主重复执行多少次指令,她始终都在一个以出发点为圆心,以R为半径的圆里,永远走不出这个圆,更走不出梦境。
     * 
     * 阿宅已经卡在这一关很久了。他很痛苦不能早日拯救公主脱离苦海,于是向聪明的你求助,让你写段代码判断哪些指令是正确的,哪些指令是错误的。
     * 
     * 输入:
     * 
     * 第一行 一个整数n
     * 
     * 之后共有n行,每行为一个指令串
     * 
     * 输入约束:
     * 
     * n位于区间[1,50]
     * 
     * 从第二行开始,每行指令串长度为1-50,且仅包含字母 S,L,R
     * 
     * 输出:
     * 
     * 仅有一个单词。
     * 
     * 指令串错误 打印 no
     * 
     * 指令串正确 打印 yes
     * 
     * 举例1:
     * 
     * 输入
     * 
     * 1
     * SLSR
     * 输出
     * 
     * yes
     * 解释:假设公主初始状态向北,公主的行动序列依次为前进,左转,前进,右转,此时公主仍然向北,但位置已经移动了。只要时间足够长,公主会一直向这个方向前进,所以公主没有在绕圈子。她能走出梦境,指令是正确的
     * 
     * 举例2:
     * 
     * 输入
     * 
     * 2
     * SSSS
     * R
     * 输出
     * 
     * no
     * 解释: 公主一直在沿着一个边长为4步的小正方形绕圈子,指令是错误的
     */
    Scanner scanner = new Scanner(System.in);
    int c = scanner.nextInt();
    String str = c + "";
    while (c > 0)
    {
      str += " " + scanner.next();
      c--;
    }
    // 以上只是拼接处字符串 例: 1 SSSL
    System.out.println(test(str));
    scanner.close();
  }

  static String test(String str)
  {
    String strs[] = new String[1];
    if (str.indexOf(" ") != -1)
    {
      strs = str.split(" ");
    }
    else
    {
      strs[0] = str;
    }
    for (int c = 0; c < 4; c++)
    {
      for (int i = 1; i < strs.length; i++)
      {
        String comd = strs[i];
        for (int j = 0; j < comd.length(); j++)
        {
          changeN(comd.charAt(j));
        }
      }
      if (x == 0 && y == 0)
      {
        return "no";
      }
    }
    return "yes";
  }

  static char n = 'N';
  static int x = 0, y = 0;

  /**
   * n = N S W E 上下左右 表示当前移动方向
   * 默认S 向上走
   * 默认坐标 x = 0, y = 0;
   * @param c S R L 3中可能
   */
  static void changeN(char c)
  {
    switch (c)
    { // 指令方向
      case 'S': // 只有S才会变更坐标, 其他情况之变化方向
        switch (n)
        {
          case 'N':
            y++;
            break;
          case 'S':
            y--;
            break;
          case 'W':
            x--;
            break;
          case 'E':
            x++;
            break;
        }
        break;
      case 'R':
        switch (n)
        {
          case 'N':
            n = 'E';
            break;
          case 'S':
            n = 'W';
            break;
          case 'W':
            n = 'N';
            break;
          case 'E':
            n = 'S';
            break;
        }
        break;
      case 'L':
        switch (n)
        {
          case 'N':
            n = 'W';
            break;
          case 'S':
            n = 'E';
            break;
          case 'W':
            n = 'S';
            break;
          case 'E':
            n = 'N';
            break;
        }
        break;
    }
  }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值