如题
最直观的思路那自然是,按照路径走判断是否可以回到原点即可,但是需要注意的是,一次回到原点不是所有路径,由于有4个方向,那么最多是需要4次回到原点。由此第一种方案
String str =instructions+instructions+instructions+instructions;
int x=0;
int y=0;
int flag = 0; //方向判断 0右 1下 2左 3上
for(int i=0;i<str.length();i++) {
char ch =str.charAt(i);
switch(ch) {
case('G'):
switch(flag) {
case(0):
x++;
break;
case(1):
y++;
break;
case(2):
x--;
break;
case(3):
y--;
}
break;
case('L'):
if(flag==0) {
flag=3;
}else {
flag--;
}
break;
case('R'):
if(flag==3) {
flag=0;
}else {
flag++;
}
}
}
return x==0&&y==0;
}
结果
需要遍历4倍字符串,不够优雅,有没有只需要遍历一次的,自然是有。将上面的退出条件摊开,其实分为三种情况。第一种,一次回到原点的,不需要讨论。第二种,两次回到原点的,这种情形对应的是,一次没回到原点,但是最终结束的时候掉了个头。第三种,4次的则是对应结束时左右转弯的。没错,唯一不能形成环的就是一路向西了。
public boolean isRobotBounded1(String instructions) {
int x=0;
int y=0;
int flag = 0; //方向判断 0右 1下 2左 3上
for(int i=0;i<instructions.length();i++) {
char ch =instructions.charAt(i);
switch(ch) {
case('G'):
switch(flag) {
case(0):
x++;
break;
case(1):
y++;
break;
case(2):
x--;
break;
case(3):
y--;
}
break;
case('L'):
if(flag==0) {
flag=3;
}else {
flag--;
}
break;
case('R'):
if(flag==3) {
flag=0;
}else {
flag++;
}
}
}
return (x==0&&y==0)||flag!=0;
}
结果