T = int(input())
for t in range(1, T+1):
n, m = map(int, input().split())
arr = []
for _ in range(n):
arr.append(list(input()))
board = [0,0,0,0]
for x in range(n) :
for y in range(m) :
if arr[x][y] == "#" :
if (x+y) % 2 == 0 :
board[0] += 1
else :
board[1] += 1
elif arr[x][y] == "." :
if (x+y) % 2 == 0 :
board[2] += 1
else :
board[3] += 1
if (board[0] != 0 and board[1] != 0) or (board[0] != 0 and board[2] != 0) or(board[2] != 0 and board[3] != 0) or (board[1] != 0 and board[3] != 0) :
answer = "impossible"
else :
answer = "possible"
print(f'#{t} {answer}')
체크모양의 보드를 만들기 위한 규칙을 생각해서 푼 문제..!
같은 모양이 인접한 곳에 겹치지 않으려면,
# 가 있는 (x,y) 의 합이 홀수라면 -> . 가 있는 (x,y) 의 합은 짝수 에만 있어야 한다.
혹은
# 가 있는 (x,y) 의 합이 짝수라면 -> . 가 있는 (x,y) 의 합은 홀수 에만 있어야 한다.\
# . #
. # .
# . #
와 같은 보드를 생각해보자.
# 는 (0,0) (0,2) (1,1) (2,0) (2,2) 로 x+y 의 합이 모두 짝수인 곳에만 존재하고,
반대로 .은 x+y 의 합이 모두 홀수인 곳에만 존재한다.
따라서 이 조건을 하나라도 어긴다면, impossible 을 출력해주면 된다.
이와 같이 x+y 의 홀수/짝수를 따지는 규칙은 유용하게 쓰일 수 있으므로 외워두면 좋을 것 같다!
'알고리즘 > 이것저것' 카테고리의 다른 글
[swea] 6019번: 기차 사이의 파리 - 파이썬(python) (0) | 2022.11.06 |
---|---|
[swea] 7584번: 자가 복제 문자열 - 파이썬(python) (0) | 2022.11.06 |
[swea] 1928번: Base64 Decoder - 파이썬(python) (0) | 2022.10.31 |
[프로그래머스] 약수의 개수와 덧셈 - 파이썬(python) (0) | 2022.09.26 |
[프로그래머스] 키패드 누르기 - 파이썬(python) (0) | 2022.09.26 |
댓글