-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindicium.py
75 lines (59 loc) · 1.49 KB
/
indicium.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/bin/python3
import math
import os
import random
import re
import sys
import numpy as np
res = ""
def getlatinsq(arr, n):
rdc = 0
cdc = 0
for i in range(N):
if len(set(arr[i])) < N:
rdc += 1
break
if len(set(arr[:,i])) < N:
cdc += 1
break
dsum = sum(arr.diagonal())
if cdc == 0 and rdc == 0:
return dsum
else:
return -1
def permute(a, sz, n, k,rs):
global res
if res:
return
if sz == 1:
nparr = np.array(arr).reshape(rs,rs)
#print(nparr , sum(nparr.diagonal()))
if getlatinsq(nparr, rs) == k:
for ti in range(rs):
t = ' '.join([str(t) for t in list(nparr[ti])]) + '\n'
res += t.lstrip()
#print("->",res)
return
for i in range(sz):
permute(a, sz-1,n,k, rs)
if res:
break
if sz & 1:
a[0], a[sz-1] = a[sz-1], a[0]
else:
a[i], a[sz-1] = a[sz-1], a[i]
if __name__ == '__main__':
T = int(input())
#print("total test",T)
for t in range(1,T+1):
N,K = input().split()
N = int(N)
K = int(K)
res = ""
arr = [i for i in range(1,N+1)]*N
permute(arr, N*N, N*N, K, N)
if res:
print("Case #{}: POSSIBLE".format(t))
print(res.rstrip())
else:
print("Case #{}: IMPOSSIBLE".format(t))