D - ABC Puzzle Editorial by kyopro_friends


各行各列に A がちょうど 1 個あるような A の置き方は \(5!=120\) 通りあります。よって、問題文中の \(1\) 番目の条件を満たすようなA, B, C の配置の仕方は高々 \(120^3\) 通りです。これを全探索します。

import itertools
N=int(input())
R=input()
C=input()

def head(s):
  for c in s:
    if c!=".":
      return c

for a,b,c in itertools.product(itertools.permutations(range(N)),repeat=3):
  if any(ai==bi or bi==ci or ci==ai for ai,bi,ci in zip(a,b,c)): continue
  S=[["."]*N for _ in range(N)]
  for i,j in enumerate(a): S[i][j]="A"
  for i,j in enumerate(b): S[i][j]="B"
  for i,j in enumerate(c): S[i][j]="C"
  if "".join(map(head,S))==R and "".join(map(head,zip(*S)))==C:
    print("Yes")
    print(*map(lambda s:"".join(s),S),sep="\n")
    exit()
print("No")

posted:
last update: