SRM 604 DIV1 Easy - PowerOfThree (復習××)

問題


http://community.topcoder.com/stat?c=problem_statement&pm=12917&rd=15837

ロボットが座標(0,0)からスタートし、4方向に移動する。
ステップ0からスタートし、各ステップ3^Kだけ指定した方向に移動する。

移動したい座標(x、y)が与えられた時、その座標に移動できるなら”Possible”、移動できないなら"Impossible"を返す。

解き方


足し引きできる数は3の階乗なので、
ビット計算に落とし込むことで解くことができる。

座標の正負は関係ないので正の座標に変換し、
例としてサンプルの一つを3進数で考えると以下のように変換できる。
x座標:1=001
y座標:9=100

ここで3の階乗を足していくステップは、
3進数の右から考えていくと毎回x、yのどちらかの数を引くことと同じになる。

ここでどちらかが1であればよいが、
どちらも0、もしくはどちらも1であれば”Impossible”になる。

途中でx=0、y=0になれば"Possible"で終了になる。

コード


class PowerOfThree {

public:


string ableToGet(int x, int y) {
x=abs(x);
y=abs(y);

while(!(x==0&&y==0)){
if(x%3==0&&y%3==0)return "Impossible";
if(x%3!=0&&y%3!=0)return "Impossible";
if(x%3==1)x--;
if(x%3==2)x++;
if(y%3==1)y--;
if(y%3==2)y++;
x/=3,y/=3;
}
return "Possible";
}

};
このエントリーをはてなブックマークに追加