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型なんて使わなくてもよかった気がするぜ!!