問題
http://community.topcoder.com/stat?c=problem_statement&pm=10515&rd=13900
六面体のキューブがある。
キューブの各面は3*3のセルからなり、
真ん中が緑、その上下左右が青、その他は赤色に塗られている。
プレイヤーは最初緑のセルからスタートし、いずれかの方向を向いている。
そこから左に向く、右に向く、前に進むの3種類のコマンドからなる
行動リストが与えられる。
このとき、最終的にいる位置のセルの色を求める。
解き方
キューブを展開して無限のセルの集合と考える。
このとき、最後の位置が最初の位置とx座標、y座標ともに3で割り切れれば緑、
どちらも割り切れないなら赤、どちらでもなければ青色になる。
コード
class CubeWalking {
public: string finalPosition(string movement) {
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
int dir=0;
int x=0,y=0;
FORE(i,0,movement.size()){
if(movement[i]=='L')dir--;
else if(movement[i]=='R')dir++;
else{
x+=dx[((dir%4)+4)%4],y+=dy[((dir%4)+4)%4];
}
}
if(x%3==0 && y%3==0)return "GREEN";
if(x%3!=0 && y%3!=0)return "RED";
return "BLUE";
}
};
public: string finalPosition(string movement) {
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
int dir=0;
int x=0,y=0;
FORE(i,0,movement.size()){
if(movement[i]=='L')dir--;
else if(movement[i]=='R')dir++;
else{
x+=dx[((dir%4)+4)%4],y+=dy[((dir%4)+4)%4];
}
}
if(x%3==0 && y%3==0)return "GREEN";
if(x%3!=0 && y%3!=0)return "RED";
return "BLUE";
}
};