현재 검사하고 있는 칸을 x,y좌표로 두는 것 보다, (0,0)에서부터 순서를 정해 cnt로 정의하면 cnt // 9, cnt % 9로 좌표를 구할 수 있어 편하다.
처음에 cnt==81 조건 이후 return을 넣었더니 출력초과가 떴다. 만족하는 모든 스도쿠의 해를 출력하고 있었던 것이다. 이 때 이용할 수 있는 함수가 exit()으로, 도달하면 컴파일된 프로그램 전체를 종료하기 때문에 처음으로 구한 해만 출력하고 종료할 수 있게 된다.
s = [[int(i) for i ininput()] for _ inrange(9)] r, c, sq = [[False]*10for _ inrange(9)],[[False]*10for _ inrange(9)],[[False]*10for _ inrange(9)] for i inrange(9): for j inrange(9): x = s[i][j] r[i][x] = c[j][x] = sq[(i//3)*3+j//3][x] = True
defsolve(cnt): global r, c, sq if cnt == 81: for i in s: print(*i, sep='') exit() x,y = cnt // 9, cnt%9 if s[x][y] == 0: for i inrange(1,10): ifnot r[x][i] andnot c[y][i] andnot sq[(x//3)*3+y//3][i]: s[x][y] = i r[x][i] = c[y][i] = sq[(x//3)*3+y//3][i] = True solve(cnt+1) s[x][y] = 0 r[x][i] = c[y][i] = sq[(x//3)*3+y//3][i] = False else: solve(cnt+1)