猫でもわかるWeb開発・プログラミング

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

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できなかった