' P '

whatever I will forget

C - Digital Graffiti

問題

atcoder.jp

深く考えすぎて全くわからず!

意外と単純な問題らしい...

こういうのを三角形として捉えなくてよいようです。
下記は多角形として捉えたらよいようです。
f:id:mankozooyork:20210207123253p:plain

解き方

自身の位置から自分の位置、左、左上、上をみて#になっていたらその数をカウントします。
その数をmod2して奇数か偶数かどうかで角になっているかどうか判定します。

こんな感じです。
f:id:mankozooyork:20210207123826p:plain

これを続けると下記のような場合に#のカウント数が奇数になります。
f:id:mankozooyork:20210207124018p:plain

奇数になった数を答えとしてカウントすれば、それすなわち角とみなし、printすればOK.

コード

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int h = sc.nextInt();
        int w = sc.nextInt();
        char[][] s = new char[h][w];
        for(int i=0; i<h; i++) {
            s[i] = sc.next().toCharArray();
        }
        sc.close();
        int ans = 0;
        for(int i=1; i<h; i++) {
            for(int j=1; j<w; j++) {
                int cnt = 0;
                if(s[i][j] == '#') cnt++;
                if(s[i-1][j] == '#') cnt++;
                if(s[i][j-1] == '#') cnt++;
                if(s[i-1][j-1] == '#') cnt++;
                if(cnt % 2 == 1) ans++;
            }
        }
        System.out.println(ans);
    }
}