这题机器人只会落在最外侧的边上。如果用暴力方法,对于每次step都一步步模拟,判断下一步会不会超出范围,会超时;改进一下,不是一步步走,而是每次走到边界,然后换方向接着走,还是超时;看了一下测试用例,在棋盘很小而步数很大的情况下,会一直绕圈,所以超时。
解决办法,每次step只是累计总步数。求坐标的时候,先对整个棋盘的周长取余,去掉绕圈,然后剩下来的步数,如果<=宽度,则落在下面那条边上;剩余步数-宽度,如果<=高度,则落在右边的边上;剩余步数-高度,如果<=宽度,则落在上面的边上;最后还有剩余则落在左边的边上。因为步数对周长取余了,所以一定只可能有这4种情况。
求方向的话,落在下面那条边,除去左边的点,都是朝东,除了初始情况,一步没走时也是朝东,之后再次落在(0,0)点时就是朝南了;落在右侧边除去最下面的点都是朝北;落在上侧边出去最右边的点都是朝西;落在左侧边出去最上面的点都是朝南。
class Robot {
int w;
int h;
int totalStep;
public Robot(int width, int height) {
w = width - 1;
h = height - 1;
totalStep = 0;
}
public void step(int num) {
totalStep += num;
}
public int[] getPos() {
int remain = totalStep % (2 *(w + h));
//System.out.println("remain = " + remain);
if(remain <= w){
return new int[]{remain, 0};
}
remain -= w;
if(remain <= h){
return new int[]{w, remain};
}
remain -= h;
if(remain <= w){//System.out.println("27! "+remain);
return new int[]{w - remain, h};
}
remain -= w;
return new int[]{0, h - remain};
}
public String getDir() {
int[] pos = getPos();
if(totalStep == 0 || (pos[1] == 0 && pos[0] > 0)){
return "East";
}else if(pos[0] == w && pos[1] > 0){
return "North";
}else if(pos[1] == h && pos[0] < w){
return "West";
}else{
return "South";
}
}
}
/**
* Your Robot object will be instantiated and called as such:
* Robot obj = new Robot(width, height);
* obj.step(num);
* int[] param_2 = obj.getPos();
* String param_3 = obj.getDir();
*/