SRM446 DIV2 過去問

250 - SoldierLabeling

トムはN個の兵士人形をカーチャンから買ってもらいました。
兵士には1からNまで番号が振ってあります。
全部数えるのはだるいので、lowerBoundからupperCound間の桁数の兵士だけ数えることにしました。
トムが数えるであろう兵士の数を返しなさいって問題。


最大値から最小値を引いて1足す。

public class SoldierLabeling {
    public int count(int n, int lb, int ub) {
        int min = (int)Math.pow(10.0, lb-1);
        int max = (int)Math.pow(10.0, ub) - 1;
        if(min>n) return 0;
        if(max>n) max = n;

        return max-min+1;
    }
}

500 - CubeWalking

3x3x3のキューブがある。キューブの各面のマスには↓のように色がついている。

  RBR
  BGB
  RBR    R=RED, B=BLUE, G=GREEN.

ある面の中央にロボットが立っています。
例えば"LLRRWWRW"のように、これからロボットが取る行動が書いてある文字列が渡されます。

  • "L"ならその場で左に90度方向転換。
  • "R"ならその場で右に90度方向転換。
  • "W"なら一歩前進。

行動を終えたとき、ロボットが立っている面の色を返せ、っていう問題。
ロボットは面からはみ出しても落ちません。ロボットのいる面が自動的に上になります。

  • ロボットが最初どこを向いているか書いてないけど、どこ向いてようが同じなのでどうでもいい
  • どの面も同じなので、面からはみ出したら反対側からコンニチワしとけばいい

ということでごりごり書くだけ。

import java.awt.Point;
public class CubeWalking {
    public String finalPosition(String movement) {
        char[][] cube = {{'R','B','R'},
                         {'B','G','B'},
                         {'R','B','R'}};

        Point[] arr = {new Point(-1,0), new Point(0,-1), new Point(1,0), new Point(0,1)};
        int dir = 0;
        Point p = new Point(1,1);
        Point mov = arr[dir];
        char[] ch = movement.toCharArray();
        for(char c : ch){
            if(c=='W'){
                p.x += mov.x;
                p.y += mov.y;
            }else{
                if (c == 'R') {
                    dir = (dir - 1);
                    if(dir<0) dir+=4;
                } else if (c == 'L') {
                    dir = (dir + 1) % 4;
                }
                mov = arr[dir];
            }
            if(p.x<0) p.x+=3;
            if(p.y<0) p.y+=3;
            if(p.x>2) p.x-=3;
            if(p.y>2) p.y-=3;
        }
        char t = cube[p.y][p.x];
        if(t=='R'){
            return "RED";
        }else if(t=='G'){
            return "GREEN";
        }else {
            return "BLUE";
        }
    }
}


べつにPoint型なんて使わなくてもよかった気がするぜ!!