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
pair同士の加減乗除テンプレート
library |   |   
  

template <typename T1, typename T2> pair<T1,T2> operator+(pair<T1,T2> p1, pair<T1,T2> p2)
{
  return make_pair(p1.first+p2.first, p1.second+p2.second);
}
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;
}
template <typename T1, typename T2> pair<T1,T2> operator-(pair<T1,T2> p1, pair<T1,T2> p2)
{
  return make_pair(p1.first-p2.first, p1.second-p2.second);
}
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;
}
template <typename T1, typename T2, typename T3> pair<T1,T2> operator*(pair<T1,T2> p, T3 n)
{
  return make_pair(p.first*n, p.second*n);
}
template <typename T1, typename T2, typename T3> pair<T1,T2> operator*=(pair<T1,T2>& p, T3 n)
{
  p.first *= n; p.second *= n; return p;
}
template <typename T1, typename T2, typename T3> pair<T1,T2> operator/(pair<T1,T2> p, T3 n)
{
  return make_pair(p.first/n, p.second/n);
}
template <typename T1, typename T2, typename T3> pair<T1,T2> operator/=(pair<T1,T2>& p, T3 n)
{
  p.first /= n; p.second /= n; return p;
}
		SRM446
08.08+.2009
黄色と青しかいない部屋。部屋で自分のレーティングがいちばん上だったのはDiv1では初めて。
| DIV | level | 問題名 | 競技中 | 後で | System Test | 通過率 | 備考 | 
|---|---|---|---|---|---|---|---|
| 1 | 250 | CubeWalking | passed | - | - | 217.03 | |
| 1 | 500 | AntOnGraph | 間に合わず | - | - | - | |
| 1 | 1000 | - | - | 
250点問題: CubeWalking
- そんなに難しい問題じゃない!
- 11'25''はかかりすぎ
500点問題: AntOnGraph
- 50x50全部つながってる場合に死ぬような方法しか思いつかなくて
- 最後の15分で道筋が見えてきたが実装ぜんぜん間に合わない
1000点問題:
- 開いてない!
Challenge Time
- 誰も500点問題をsubmitしてない
- 撃墜ゼロ
217.03点で室内6位。Div1全体では342/734位
- 全問通してるのがEryx1人だけ
1582→1588 (+6) 微増
コメント
	トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/n4_t/20090809
		


 
