[白俊]2018-チェス盤の塗り直し(Python)


質問する
志敏は自分の住宅で、MN単位の正方形で区切られたM.×Nサイズのボードが見つかりました.一部の正方形は黒に塗り、残りは白に塗ります.志敏はこの板を8切った.×8ヤードのチェス盤を作ります.
チェスの碁盤は白黒の間にあるべきだ.具体的には、各セルは白黒の1つに塗り、共有エッジの2つの長方形は異なる色に塗ります.したがって,この定義によれば,チェス盤が色付く場合は2つしかない.一つは左上の格子が白で、一つは黒です.
スケートボードがチェス盤のように塗る保証がないので、智敏8×8ヤードのチェス盤に切って、正方形をいくつか塗りたいです.もちろん、8 x 8サイズは自由に選べます.プログラムを書いて、志敏が塗り直す正方形の最小個数を求めます.
入力例
10 13
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
WWWWWWWWWWBWB
WWWWWWWWWWBWB
に近づく
通常のチェス盤を作るには2つの状況がある.
  • チェス盤の1段目がBであれば、チェス盤の図案は
    BWBWBWBW
    WBWBWBWB
    BWBWBWBW
    WBWBWBWB
    BWBWBWBW
    WBWBWBWB
    BWBWBWBW
    WBWBWBWB
  • チェス盤の1段目がWであれば、チェス盤の図案は
    WBWBWBWB
    BWBWBWBW
    WBWBWBWB
    BWBWBWBW
    WBWBWBWB
    BWBWBWBW
    WBWBWBWB
    BWBWBWBW
  • 他の方法が思いつかないので、8 x 8でカットできる場合をすべてテストすることにしました.どちらの場合も2行パターンを4回繰り返す構成単位で比較する.
    0.w case="WB"4+"BW"4,b case="BW"4+"WB"4に設定します.
    1.入力を8 x 8 2 D配列にスライドします.
    2.スライス配列の1、2/3、4/5、6/7、8行を1行に統合し、各症例と比較した.
    3.missより少ないページを、b caseおよびw caseよりも現在の最小値と更新する.
    に答える
    N,M = map(int, input().split())
    board = []
    for _ in range(N) :
        board.append(input())
    
    w_case = "WB"x4 + "BW"x4
    b_case = "BW"x4 + "WB"x4
    min = 2174000
    cnt_1 = 0
    cnt_2 = 0
    
    for r in range(N-7):
        for c in range(M-7):
    
            cnt_1 = 0
            cnt_2 = 0
            sector = ""
    
            for row in board[r:r+8] :
                sector += row[c:c+8]
                if len(sector) == 16:
                    for i in range(16) :
                        if sector[i] != w_case[i]:
                            cnt_1 += 1
                        elif sector[i] != b_case[i] :
                            cnt_2 += 1
                    sector = ""
    
            if cnt_1 <= cnt_2 and cnt_1 < min :
                min = cnt_1
            elif cnt_2 < cnt_1 and cnt_2 < min :
                min = cnt_2
    
    print(min)