はまやんはまやんはまやん

hamayanhamayan's blog

Ruined Square [AtCoder Beginner Contest 108 B]

https://beta.atcoder.jp/contests/abc108/tasks/abc108_b

解法

https://beta.atcoder.jp/contests/abc108/submissions/3127271

回転行列を知らないと解くのは難しい。
dx=d2-d1, dy=y2-y1とした、(dx, dy)というベクトルを考える。
すると、(x2,y2)から(x3,y3)へのベクトルは、反時計回りに90度回転したものになる。
これは回転行列を使うと解決できる。
具体的には90度回転すると、dx=-dy, dy=dxになる。
なので、「回転して足して答える」を2回やるとACが取れる。

int xx1, yy1, x2, y2;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> xx1 >> yy1 >> x2 >> y2;
    
    int dx = x2 - xx1, dy = y2 - yy1;
    int x = x2, y = y2;
 
    rep(i, 0, 2) {
        int _dx = -dy;
        int _dy = dx;
        dx = _dx;
        dy = _dy;
 
        x = x + dx;
        y = y + dy;
 
        printf("%d %d", x, y);
        if (i == 0) printf(" ");
        else printf("\n");
    }
}