有人能做出来么

qq_33190686 2020-06-16 03:02:57
最近阿宅迷上了一款二次元游戏叫<<解救公主>>。

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

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

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

指令有三个字符组成 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步的小正方形绕圈子,指令是错误的
...全文
498 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2020-06-19
  • 打赏
  • 举报
回复
晕,方向不变是看L和R抵消错别字
qybao 2020-06-19
  • 打赏
  • 举报
回复
忘了发测试数据的代码了
说明一下,方向不变还是看L和R抵消,而是看转的角度%360是否和原来一样。因为LLLLS没有R抵消也是方向不变(转了360度),所以它也是yes
完整代码
import java.util.Random;
import java.util.Scanner;
public class Sample {
public static void main(String[] args) {
boolean test = true; //用户手动输入数据改成false即可
String[] cmd;
if (!test) {
System.out.println("输入");
cmd = getUserInput();
System.out.printf("输出\n%s\n", checkCmd(cmd));
} else { //自动测试
for (int i=0; i<5; i++) {
cmd = getRandomCmd(i);
System.out.printf("测试%d\n输入\n%d\n", i+1, cmd.length);
for (String s : cmd) {
System.out.println(s);
}
System.out.printf("输出\n%s\n\n", checkCmd(cmd));
}
}
}

public static String[] getUserInput() {
Scanner sc = new Scanner(System.in);
int n = 0;
while (true) {
try {
//System.out.println("请输入1-50之间的数字:");
n = Integer.valueOf(sc.nextLine());
if (n>0&&n<51) break;
} catch (Exception e) {
n = 1; //default
break;
}
//System.out.println("输入错误,请重输。");
}
String []cmd = new String[n];
for (int i=0; i<n; i++) {
while(true) {
try {
//System.out.printf("请输入第%d行指令(指令必须有[LRS]中字母构成其总长度不超过50):");
cmd[i] = sc.nextLine();
if (cmd[i].matches("[LRS]{1,50}")) break;
} catch (Exception e) {
cmd[i] = "S"; //default
break;
}
//System.out.println("输入错误,请重输。");
}
}
return cmd;
}

public static String checkCmd(String[] cmd) {
int angle=0, x0=0, y0=0, x=x0, y=y0; //方向(角度),距离
for (String s : cmd) {
for (char c : s.toCharArray()) {
if (c=='L') {
angle -= 90; //以左转为-90度
} else if (c=='R') {
angle += 90; //右转为+90度
} else if (c=='S') { //以北为0度
int m = angle%360;
if (m==0) y++; //往北走
else if (m==-90 || m==270) x--; //往西走
else if (m==180 || m== -180) y--; //往南走
else if (m==-270 || m==90) x++; //往东走
}
}
}
if (angle%360==0 && (x!=x0 || y!=y0)) { //如果方向不变位置改变
return "yes";
} else {
return "no";
}
}

public static String[] getRandomCmd(int uc) { //测试数据
if (uc==0) return new String[] {"LLLLS"};
else if (uc==1) return new String[] {"SSSS", "R"};
char[] chs = {'L', 'R', 'S'};
Random rad = new Random();
if (uc>49) uc=49;
int n = rad.nextInt(uc+1) + 1;
String[] cmd = new String[n];
for (int i=0; i<n; i++) {
int len = rad.nextInt(50) + 1;
StringBuilder buf = new StringBuilder();
for (int j=0; j<len; j++) {
buf.append(chs[rad.nextInt(3)]);
}
cmd[i] = buf.toString();
}
return cmd;
}
}
qybao 2020-06-19
  • 打赏
  • 举报
回复
我觉得只要指令能保证一下两个条件就可以(其实就是结合1L和2L的条件)
一是,指令执行完后方向不变(即L和R抵消)//光方向不变不行,还要不能停留在原来的位置,比如LLSSRRSS,方向不变,实在停留在原点
二是,指令执行完后位置改变(即不停留在原地)//光位置有改变不行,还要方向不变,LZ的例子的SSSSR就是这个问题,不管转L还是转R都是90度转,第4次就会360度转回到原点,如果是LL或RR180度转,那第二次就会回到原点
所以,综上,我觉得只要同时满足条件1和2,就不会饶圈子(也就是不管怎么重复,都是勇往直前
代码sample

import java.util.Random;
import java.util.Scanner;
public class Sample {
public static void main(String[] args) {
boolean test = true; //用户手动输入改成false即可
String[] cmd;
if (!test) {
System.out.println("输入");
cmd = getUserInput();
System.out.printf("输出\n%s\n", checkCmd(cmd));
} else { //自动测试
for (int i=0; i<5; i++) {
cmd = getRandomCmd(i);
System.out.printf("测试%d\n输入\n%d\n", i+1, cmd.length);
for (String s : cmd) {
System.out.println(s);
}
System.out.printf("输出\n%s\n\n", checkCmd(cmd));
}
}
}

public static String[] getUserInput() {
Scanner sc = new Scanner(System.in);
int n = 0;
while (true) {
try {
//System.out.println("请输入1-50之间的数字:");
n = Integer.valueOf(sc.nextLine());
if (n>0&&n<51) break;
} catch (Exception e) {
n = 1; //default
break;
}
//System.out.println("输入错误,请重输。");
}
String []cmd = new String[n];
for (int i=0; i<n; i++) {
while(true) {
try {
//System.out.printf("请输入第%d行指令(指令必须有[LRS]中字母构成其总长度不超过50):");
cmd[i] = sc.nextLine();
if (cmd[i].matches("[LRS]{1,50}")) break;
} catch (Exception e) {
cmd[i] = "S"; //default
break;
}
//System.out.println("输入错误,请重输。");
}
}
return cmd;
}

public static String checkCmd(String[] cmd) {
int angle=0, x0=0, y0=0, x=x0, y=y0; //方向(角度),距离
for (String s : cmd) {
for (char c : s.toCharArray()) {
if (c=='L') {
angle -= 90; //以左转为-90度
} else if (c=='R') {
angle += 90; //右转为+90度
} else if (c=='S') { //以北为0度
int m = angle%360;
if (m==0) y++; //往北走
else if (m==-90 || m==270) x--; //往西走
else if (m==180 || m== -180) y--; //往南走
else if (m==-270 || m==90) x++; //往东走
}
}
}
if (angle%360==0 && (x!=x0 || y!=y0)) { //如果方向不变位置改变
return "yes";
} else {
return "no";
}
}
}


冰思雨 2020-06-19
  • 打赏
  • 举报
回复
数一下所有的指令序列,里面的L的个数必须等于R的个数,否则,L和R之间存在S,就会绕圈。 这是数学题吧? 编程不是关键。
十八道胡同 2020-06-17
  • 打赏
  • 举报
回复
我的初步想法是模拟,根据他输入的指令,来模拟走法,最后判断下 全部走完之后和初始点的位置差距 如果和初始点一样,就是no,否则就是yes

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧