๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/DFS BFS

[Python] ๋ฐฑ์ค€ 1915 ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•

by JayAlex07 2023. 3. 31.

๐Ÿง‘‍๐Ÿ’ป [Python] ๋ฐฑ์ค€ 1915 ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•

Gold 2 - Backtracking

img

ํ–‰๋ ฌ์„ ์ˆœํšŒํ•˜๋ฉด์„œ, 1์„ ์ฐพ๊ฒŒ๋˜๋ฉด, ๊ทธ 1์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์ตœ์†Œ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค

  • ์˜ˆ) ์ฐพ์€ 1์„ ๊ธฐ์ค€์œผ๋กœ 1X1 ์ƒ‰์ข…์ด๋ฅผ ๋ฎ์„ ๊ฒฝ์šฐ
  • ์˜ˆ) ์ฐพ์€ 1์„ ๊ธฐ์ค€์œผ๋กœ 2X2 ์ƒ‰์ข…์ด๋ฅผ ๋ฎ์„ ๊ฒฝ์šฐ
  • ์˜ˆ) ์ฐพ์€ 1์„ ๊ธฐ์ค€์œผ๋กœ 3X3 ์ƒ‰์ข…์ด๋ฅผ ๋ฎ์„ ๊ฒฝ์šฐ
  • ์˜ˆ) ์ฐพ์€ 1์„ ๊ธฐ์ค€์œผ๋กœ 4X4 ์ƒ‰์ข…์ด๋ฅผ ๋ฎ์„ ๊ฒฝ์šฐ
  • ์˜ˆ) ์ฐพ์€ 1์„ ๊ธฐ์ค€์œผ๋กœ 5X5 ์ƒ‰์ข…์ด๋ฅผ ๋ฎ์„ ๊ฒฝ์šฐ

56๋ฒˆ์งธ ์ค„์ด ๋๋‚˜๋ฉด, ๋Œ€๋ถ€๋ถ„์˜ 1์€ 0์œผ๋กœ ๋ฐ”๊ปด์ ธ ์žˆ์„ ๊ฒƒ์ด๋‹ค (๋งŒ์•ฝ ํ•œ ์‚ฌ์ด์ฆˆ์˜ ์ƒ‰์ข…์ด๋ฅผ 5์žฅ์„ ๋„˜๊ธฐ๋ฉด, 1๋กœ ์œ ์ง€๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค)


 

์ฝ”๋“œ

matrix = [list(map(int, input().split())) for _ in range(10)]

count = [0] * 6

ans = 25

def is_possible(i, j, size):
    if count[size] == 5:
        return False

    if i + size > 10 or j + size > 10:
        return False

    for r in range(size):
        for c in range(size):
            if matrix[i + r][j + c] == 0:
                return False

    return True


def mark(i, j, size, fill):
    for r in range(size):
        for c in range(size):
            matrix[i + r][j + c] = fill

    if fill == 0:
        count[size] += 1
    else:
        count[size] -= 1


def backtrack(i, j):

    global ans

    if i == 10:
        ans = min(ans, sum(count))
        return

    if j == 10:
        backtrack(i + 1, 0)
        return

    if matrix[i][j] == 0:
        backtrack(i, j + 1)
        return

    for size in range(1, 6):
        if is_possible(i, j, size):
            mark(i, j, size, 0)
            backtrack(i, j + 1)
            mark(i, j, size, 1)


backtrack(0, 0)
print(-1 if ans == 25 else ans)