E. Robot on the Board 1

問題

解説

  • ステージ上のどの領域が「生きている領域」かを管理する
  • 例えば3x3のステージで最初の移動が右だった場合、右端の領域は死ぬ(画像参照)
  • これはAtCoderで類題があったはず(思い出したら追記する)

f:id:peroon:20211103144846p:plain

void solve(){
  ll H,W;cin>>H>>W;
  string s;cin>>s;

  // 安全地帯 y方向
  ll upper=1;
  ll lower=H;

  // 安全地帯 x方向
  ll left=1;
  ll right=W;

  // ロボットの位置のmin, max
  ll y_min=0;
  ll y_max=0;
  ll x_min=0;
  ll x_max=0;

  // ロボットの位置
  ll y=0;
  ll x=0;

  for(char c : s){
    if(c=='L'){
      x--;
      if(x<x_min){
        left++;
      }
    }
    else if(c=='R'){
      x++;
      if(x>x_max){
        right--;
      }
    }
    else if(c=='D'){
      y++;
      if(y>y_max){
        lower--;
      }
    }
    else if(c=='U'){
      y--;
      if(y<y_min){
        upper++;
      }
    }

    if(left>right){
      if(c=='R'){
        p2(upper,left);return;
      }else{
        p2(upper,right);return;
      }
    }

    if(upper>lower){
      if(c=='U'){
        p2(lower,left);return;
      }else{
        p2(upper,left);return;
      }
    }

    chmin(y_min,y);
    chmax(y_max,y);

    chmin(x_min,x);
    chmax(x_max,x);
  }

  // 最後まで生き延びた場合
  p2(upper,left);return;
}

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);

    // input
    ll N;
    cin>>N;

    while(N--)solve();
    
    return 0;
}

行列のアフィン変換(平行移動・回転・X軸で反転(-1倍の拡大))

(自分の検索用の記事です)

アフィン変換とは?平行移動、拡大縮小、回転、スキューができる。2次元平面を考えているなら3x3の行列で表現。ベクトルは(x,y,1)

使った問題

言い換え

  • x=pで反転とは、平行移動・-1倍・平行移動(戻し)に分解できるので、アフィン変換行列で表現できる

その他のキーワード

  • 線対称