2009-08-09
SRM446 Div1 Easy: CubeWalking
提出版(こんなに書いてるから時間が無駄にかかる)
- x,y座標を -1,0,1 で取っているのは % を使うのに面倒くさい(ので0,1,2で取ってるコードを見て!!!と思った)けれど、今回の場合は最後の判定が -1,0,1の方が(自分的に)直感的だったので良しとする
- 30%無駄コードルールを気にして最初にいろいろ消してしまったので、repがなくてコンパイルエラーが出た
- ていうか配列でいいだろx()とかy()とか何なの?馬鹿なの?死ぬの?
#define sz(a) int((a).size())
class CubeWalking {
private:
int dir(int x,int y){
switch(x){
case 1: return 0;
case -1: return 2;
default: return (y==1)?1:3;
}
}
int x(int d){
switch(d){
case 0: return 1;
case 1: return 0;
case 2: return -1;
case 3: return 0;
}
}
int y(int d){
switch(d){
case 0: return 0;
case 1: return 1;
case 2: return 0;
case 3: return -1;
}
}
public:
string finalPosition(string movement) {
int n=sz(movement);
int dx=1,dy=0;
int ox=0,oy=0;
int d=0;
for(int i=0;i<n;i++){
switch(movement[i]){
case 'L':
d=(dir(dx,dy)+1)%4;
dx=x(d); dy=y(d); break;
case 'R':
d=(dir(dx,dy)+3)%4;
dx=x(d); dy=y(d); break;
case 'W':
ox+=dx;
if (ox==2) ox=-1;
else if (ox==-2) ox=1;
oy+=dy;
if (oy==2) oy=-1;
else if (oy==-2) oy=1;
break;
}
}
if (ox*oy) return "RED";
if (ox+oy) return "BLUE";
return "GREEN";
}
};
改良版:
- 90度単位のベクトルの回転ぐらいライブラリ用意しとけ
- pairの初期化はmake_pair不要><
- pairの加減乗除ぐらいテンプレート書いておく
- 負数の%の仕様が気に入らないならunsignedでキャストすればいいじゃない
#define sz(a) int((a).size())
#define rep(var,n) for(int var=0;var<(n);var++)
template <typename T1, typename T2> pair<T1,T2> operator+=(pair<T1,T2>& p1, pair<T1,T2> p2)
{
p1.first += p2.first; p1.second += p2.second; return p1;
}
pair<int,int> turn(pair<int,int> dir, int deg){
if (deg < 0) deg = 360 - ((-deg)%360);
deg %= 360;
switch(deg){
case 0: default:
return dir;
case 90:
return make_pair(-dir.second, dir.first);
case 180:
return make_pair(-dir.first, -dir.second);
case 270:
return make_pair(dir.second, -dir.first);
}
}
class CubeWalking {
private:
public:
string finalPosition(string movement) {
int n=sz(movement);
pair<int,int> d(1,0), o(0,0);
rep(i,n){
switch(movement[i]){
case 'L': d=turn(d,90); break;
case 'R': d=turn(d,-90); break;
case 'W': o+=d; break;
}
}
int ox=((unsigned)o.first+1)%3-1;
int oy=((unsigned)o.second+1)%3-1;
if (ox*oy) return "RED";
if (ox+oy) return "BLUE";
return "GREEN";
}
};
追記
- 向きをd={0,1,2,3}で持っておいて、ox+=dx[d], oy+=dy[d]みたいにやるのが一番簡単そう…orz
コメント
トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/n4_t/20090809