Official

B - Spiral Galaxy Editorial by cn449


\(H,W\) の制約が十分小さいので、すべての長方形領域に対して点対称であるかをそれぞれ判定すればよいです。

長方形領域の列挙の際には、問題文中の形式的な説明のように、一番上の行・一番下の行・一番左の列・一番右の列を固定するのが簡潔です。

長方形領域を全探索する多重ループの中でその長方形領域が点対称であるかを表す変数を true で初期化しておき、長方形領域が点対称に塗られているならば同じ色で塗られているべきだが実際には違う色で塗られているマスの組を発見したときに変数を false に更新するとよいです。マスの組についても、愚直にすべてのマスを確認しても十分高速です。

実装例

#include <bits/stdc++.h>
using namespace std;

int main() {
	int h, w;
	cin >> h >> w;
	vector<string> s(h);
	for (int i = 0; i < h; i++) cin >> s[i];
	int ans = 0;
	for (int h1 = 0; h1 < h; h1++) {
		for (int h2 = h1 + 1; h2 <= h; h2++) {
			for (int w1 = 0; w1 < w; w1++) {
				for (int w2 = w1 + 1; w2 <= w; w2++) {
					bool flag = true;
					for (int i = h1; i < h2; i++) for (int j = w1; j < w2; j++) if (s[i][j] != s[h1 + h2 - i - 1][w1 + w2 - j - 1]) flag = false;
					if (flag) ans++;
				}
			}
		}
	}
	cout << ans << '\n';
}

posted:
last update: