白俊解答-チェス盤を1018回塗り直す
6727 ワード
📜 理解问题
志敏は自分の住宅で、MN単位の正方形で区切られたM.×Nサイズのボードが見つかりました.一部の正方形は黒に塗り、残りは白に塗ります.志敏はこの板を8切った.×8ヤードのチェス盤を作ります.
チェスの碁盤は白黒の間にあるべきだ.具体的には、各セルは白黒の1つに塗り、共有エッジの2つの長方形は異なる色に塗ります.したがって,この定義によれば,チェス盤が色付く場合は2つしかない.一つは左上の格子が白で、一つは黒です.
スケートボードがチェス盤のように塗る保証がないので、智敏8×8ヤードのチェス盤に切って、正方形をいくつか塗りたいです.もちろん8*8の大きさは自由に選べます.プログラムを書いて、志敏が塗り直す正方形の最小個数を求めます.
💡 問題の再定義
任意に色を塗った回路基板を8 x 8サイズに切る場合、色を塗った矩形の最小値が必要です.
▼▼▼計画作成
この問題は8×8のサイズで一つ一つカットして、中に塗るところを数える方法で解決できます.つまり、ブルートフォスが一つ一つ確認する方法で実現します.この場合,色付きの行+列が偶数か奇数かを選択し,前の2つの場合の数字を考慮する.
💻 計画の実行
if __name__ == '__main__':
N, M = map(int, input().split())
chess_board = []
for _ in range(N):
chess_board.append(input())
cnt_list = []
for row in range(N - 7):
for col in range(M - 7):
cnt1 = 0
cnt2 = 0
for i in range(row, row + 8):
for j in range(col, col + 8):
if (i + j) % 2 == 0:
if chess_board[i][j] == 'W':
cnt1 += 1
if chess_board[i][j] == 'B':
cnt2 += 1
else:
if chess_board[i][j] == 'B':
cnt1 += 1
if chess_board[i][j] == 'W':
cnt2 += 1
cnt_list.append(cnt1)
cnt_list.append(cnt2)
print(min(cnt_list))
🤔 振り返る
Brootforceで問題を解決する方法なので難しくはありませんが、最初に実現したときは上記のような行と列の加算ではなく、左上隅の値と比較します.上図に示すように、2つの場合、上記のコードはずっと簡潔になっているようです.
Reference
この問題について(白俊解答-チェス盤を1018回塗り直す), 我々は、より多くの情報をここで見つけました https://velog.io/@delicate1290/백준-문제-풀이-체스판-다시-칠하기-1018번テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol