์๊ณ ๋ฆฌ์ฆ/DFS BFS
[Python] ๋ฐฑ์ค 1915 ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ
by JayAlex07
2023. 3. 31.
๐งโ๐ป [Python] ๋ฐฑ์ค 1915 ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ
Gold 2 - Backtracking

ํ๋ ฌ์ ์ํํ๋ฉด์, 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)