各黒マスが答えに寄与する値を求めることでこの問題を解くことが出来ます。 以下のステップをたどることでこの問題を解くことが出来ます。

  1. 答えを持つ変数 ans を用意します。
  2. 全ての黒マスを探索します。つまり、各マス(i, j)について、そのマスが黒い場合(Si,jS_{i,j} = #) について考えます。
  3. 各黒マスについて、その上下左右のマスをみます。つまり、(i1,j),(i+1,j),(i,j1),(i,j+1)(i-1, j), (i+1, j), (i, j-1), (i, j+1) のマスをみます。
  4. 上記各マスがグリッドの範囲内に存在し、それが白マス (Si,j=.Si,j = '.') である場合もしくはグリッドの範囲外である場合、ans11 加算します。つまり、そのマスは黒マスの図形の周囲に寄与しています。
  5. 答えを出力します。
Python
h, w = map(int,input().split())
S = []
for i in range(h):
    s = list(input())
    S.append(s)

ans = 0
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

def isvaild(x, y):
    return 0 <= x < h and 0 <= y < w

for i in range(h):
    for j in range(w):
        if(S[i][j]=="#"):
            for k in range(4):
                nx = i + dx[k]
                ny = j + dy[k]
                if(isvaild(nx, ny)):
                    if(S[nx][ny] == "."):
                        ans += 1
                else:
                    ans += 1

print(ans)
C++
#include<bits/stdc++.h>
using namespace std;

int main() {
    
    int h, w;
    cin >> h >> w;
    vector<string> s(h + 2 , string(w + 2, '.'));
    for (int i = 1; i <= h; i++) {
        for (int j = 1; j <= w; j++) {
            cin >> s[i][j];
        }
    }

    int ans = 0;
    for (int i = 0; i <= h; i++) {
        for (int j = 0; j <= w; j++) {
            if(s[i][j] != s[i][j + 1]) ans++;
            if(s[i][j] != s[i + 1][j]) ans++;
        }
    }

    cout << ans << endl;
}