ABC197
2021/3/27に開催されたAtCoder Beginner Contest 197の考え方をメモるエントリです。
A - Rotate
string s; cin >> s; cout << s[1] << s[2] << s[0] << endl;
特に難しいことはありません。もう少しスマートな書き方がある気はしますがACすればいいんです((
B - Visibility
マス目は上からマス、左からマスであることに注意します。
マス目の状態を配列にぶちこんで、マス目の上下左右に.
がいくつあるかを数えればいいです。
D - Opposite
正n角形についての問題です。
から正n角形の中心を求める
→その中心から見たの相対座標を求める
→それを度回転させる
→相対座標を絶対座標に戻す
という手順を踏みました。
int n, x0, y0, xh, yh; cin >> n >> x0 >> y0 >> xh >> yh; double xc = (x0 + xh) / 2.0; double yc = (y0 + yh) / 2.0; double xc0 = x0 - xc; double yc0 = y0 - yc; double rad = 2 * M_PI / n; double xc1 = xc0 * cos(rad) - yc0 * sin(rad); double yc1 = xc0 * sin(rad) + yc0 * cos(rad); double x1 = xc1 + xc; double y1 = yc1 + yc; printf("%.10lf %.10lf\n", x1, y1);
回転には回転行列的な考え方を使いました。
この式は、点を原点を中心として角だけ回転させると点になることを表しています。
これを計算すると
となるので、コード中ではこの式を使用しました。