【AtCoder】ABC 430 B - Count Subgrid

atcoder.jp favicon

実行時間制限: 2 sec / メモリ制限: 1024 MiB / Difficulty: 141 / NoviSteps: 4Q / 配点: 250

問題概要

NNNN 列からなるグリッドがあり、グリッドの上から ii 行目左から jj 列目のマスは、Si,jS_{i,j}#のとき黒く、.のとき白く塗られている。

このグリッドから縦 MM 行横 MM 列の領域を取り出して得られるマスの塗られ方は何種類あるか求めよ。

制約

  • 1MN101\leq M \leq N \leq 10
  • N,MN,M は整数

考察

種類数だけを求めればよいので、setを用いるのが良いだろう。

グリッドから M×MM \times M の領域を取り出してきたものを、vector<string>などで保存し、setにそのまま突っ込んでいく。

最後にそのsetのサイズを出力すればよい。

実装例

CPP
1.#include <bits/stdc++.h>
2.using namespace std;
3.
4.#define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++)
5.
6.// ======================================== //
7.
8.int main()
9.{
10. int N, M;
11. cin >> N >> M;
12. vector<string> S(N);
13. rep(i, 0, N) cin >> S[i];
14.
15. set<vector<string>> st;
16. rep(i, 0, N - M + 1) rep(j, 0, N - M + 1)
17. {
18. vector<string> subgrid(M);
19. rep(di, 0, M)
20. {
21. subgrid[di] = S[i + di].substr(j, M);
22. }
23. st.insert(subgrid);
24. }
25.
26. cout << st.size() << endl;
27.
28. return 0;
29.}
atcoder.jp favicon

実装時間: 5 分

コメント

setに(実質的な)二次元配列を突っ込めるのはなかなか意識が及ばないかもしれない。