프로그래밍/백준
백준 1824 - 도미노 (파이썬)
beans3142
2022. 4. 28. 16:50
난이도
플래티넘 3
유형
이분 매칭
해결
아이디어를 떠올리기까지 한참 걸렸다.
비숍 문제와 같이 흑백으로 생각하고 이분매칭을 이용해주면 풀린다.
코드
from sys import stdin
from collections import defaultdict
input=stdin.readline
def dfs(x):
if vi[x]:
return False
vi[x]=True
for i in able[x]:
if placed[i]==0 or dfs(placed[i]):
vi[i]=True
placed[i]=x
return True
return False
n,m=map(int,input().split())
able=[[] for i in range(n*m+1)]
arr=[[m*j+i for i in range(1,m+1)] for j in range(n)]
for i in range(n):
for j in range(m-1):
if (i+j)%2==0:
able[arr[i][j]].append(arr[i][j+1])
else:
able[arr[i][j+1]].append(arr[i][j])
for i in range(n-1):
for j in range(m):
if (i+j)%2==0:
able[arr[i][j]].append(arr[i+1][j])
else:
able[arr[i+1][j]].append(arr[i][j])
l=int(input())
for i in range(l):
a,b=map(int,input().split())
able[a]=[i for i in able[a] if i!=b]
able[b]=[i for i in able[b] if i!=a]
vi=[False]*(n*m+1)
placed=[0]*(n*m+1)
mx=n*m
for i in range(1,n*m+1):
for j in range(1,n*m):
vi[j]=False
dfs(i)
for i in range(n):
for j in range(m):
if (i+j)%2:
print(i*m+j+1,placed[i*m+j+1])