ことさら−古都プログラマーの更級日記

京都でお寺を回りながら御朱印集めをしていたエンジニアのブログ。おもに技術的なはなしとか日常的なはなし

yukicoder No.208 王将

通常、原点から(x,y)への最短距離は複数個存在するので、途中の歩兵 *1 の存在は問題にならないが、|x| == |y| *2 となる場合のみ、最短距離は1通りしかなくなる。この時に、ルート上に歩兵がある場合のみ、迂回しなければならず、距離が+1される。

まとめると

  • |x| == |y|
  • |hx| == |hy|
  • |hx| < |x| *3
  • (x,y) と (hx,hy) が同じ象限にある

場合のみ距離を+1する

コードの主要部分

int main(int argc, const char * argv[]){
    int x, y, hx, hy;
    cin >> x >> y >> hx >> hy;
    
    int ans = max(x, y);
    

    if(abs(x) == abs(y) && abs(hx) == abs(hy) && abs(x) > abs(hx)){
        if(x > 0 && y > 0 && hx > 0 && hy > 0){
            ans++;
        }else if(x > 0 && y < 0 && hx > 0 && hy < 0){
            ans++;
        }else if(x < 0 && y > 0 && hx < 0 && hy > 0){
            ans++;
        }else if(x < 0 && y < 0 && hx < 0 && hy < 0){
            ans++;
        }
    }
    
    cout << ans << endl;
}

今回はわかりやすいように条件を細かく書いていますが、もっと簡単に書くこともできます。

*1:”ふひょう”と読む

*2:"|"は絶対値の記号

*3:この条件を忘れてて本番ではACできなかった