Cod sursa(job #2511021)

Utilizator AndreiStanescuAlloys Nokito AndreiStanescu Data 17 decembrie 2019 21:35:25
Problema Problema Damelor Scor 50
Compilator py Status done
Runda Arhiva educationala Marime 4.44 kb
"""l=[-1,0,1]

def dist(L):
    return abs(L[0]-L[1])+abs(L[0]-L[2])+abs(L[1]-L[2])

sol=list()
q=int(input())
for i in range(0,q):
    f = input().split(' ')
    d=4*10**9+1
    F=[int(f[i]) for i in range(0,len(f))]
    '''for j in l:
        d=min(d,dist([F[0],F[1],F[2]+j]))
    for j in l:
        d=min(d,dist([F[0],F[1]+j,F[2]]))
    for j in l:
        d=min(d,dist([F[0]+j,F[1],F[2]]))'''
    for j in l:
        for k in l:
            for v in l:
                d = min(d, dist([F[0]+j, F[1]+k, F[2]+v]))
    sol.append(d)

for i in range(0,q-1):
    print(sol[i])
print(sol[q-1],end='')"""

'''f=input().split(' ')
n=int(f[0])
k=int(f[1])
s=str(input().replace('\n',''))
c=input().split(' ')
sol=0
for j in range(1,len(s)):
    for i in range(0, len(s)-j+1):
        #print(s[i])
        k=i
        ok=0
        while k<i+j and ok==0:
            if s[k] not in c:
                ok=1
            k+=1
        if k==i+j and ok==0:
             sol+=1
print(sol)'''

"""rez=[]
for i in range(0,len(s)):
    if s[i] not in c:
        rez.append(i)
if len(rez)==len(s):
    print(0,end='')
elif len(rez)==0:
    print(n*(n+1)//2,end='')
elif len(rez)==1:
    ad=rez[0]
    ans=( ad*(ad+1) )//2
    j=n-ad-1
    ans+= ( j*(j+1) )//2
    print(ans,end='')
else:
    i1=0
    ad=rez[0]
    ans=( ad*(ad+1) )//2
    i=ad
    for it in range(1,len(rez)):
        i=rez[it]
        ad=i-i1-1
        ans+=( ad*(ad+1) )//2
        i1=i
    j=n-i-1
    ans+= ( j*(j+1) )//2
    print(ans,end='')"""

"""q=int(input())
for i in range(0,q):
    n=int(input())
    p=input().split(' ')
    p=[int(p[i])-1 for i in range(0,n)]
    viz=[0]*n
    ans=[0]*n
    for i in range(0,n):
        if viz[i]==0:
            cycle=list()
            pos=i
            sol=0
            while viz[pos]==0:
                viz[pos]=1
                cycle.append(pos)
                pos=p[pos]
                sol+=1
            for j in cycle:
                ans[j]=sol
    for i in ans:
        print(i,end=' ')
    print()
"""
f = open("damesah.in", "r")
n = int(f.read())
f.close()
L = [[0 for i in range(0, n)] for j in range(0, n)]
L1 = [-1 for i in range(0, n)]
ans = 0
g = open("damesah.out", "w")


def verificare_ataca(sol):
    ok = 1
    for i in range(0, len(sol)):
        for j in range(0, i):
            if sol[i][0] == sol[j][0] or sol[i][1] == sol[j][1] or abs(sol[i][0] - sol[j][0]) == abs(
                    sol[i][1] - sol[j][1]):
                ok = 0
                break
    return (ok == 1)


def verificare_basic(L):
    sol = []
    for i in range(0, n):
        for j in range(0, n):
            if L[i][j] == 1:
                sol.append((i + 1, j + 1))
    if len(sol) == n and verificare_ataca(sol) == 1:
        ans = [x[1] for x in sol]
        return ans
    return 0


def verificare_partiala(L):
    sol = []
    for i in range(0, n):
        for j in range(0, n):
            if L[i][j] == 1:
                sol.append((i + 1, j + 1))
    if verificare_ataca(sol) == 1:
        ans = [x[1] for x in sol]
        return ans
    return 0


def back(x, y, k):
    global ans
    if y == n:
        y = 0
        x += 1
    if verificare_partiala(L) == 0:
        return
    if x == n and y == 0:
        if k == n:
            if verificare_basic(L) != 0:
                rez = verificare_basic(L)
                ans += 1
                if ans == 1:
                    for t in rez:
                        g.write(str(t))
                        g.write(' ')
                    g.write('\n')
        # verific solutia
    else:
        L[x][y] = 1
        k += 1
        back(x, y + 1, k)
        k -= 1
        L[x][y] = 0
        back(x, y + 1, k)


def verificare1_ataca(sol,x):
    for i in range(0, x):
        for j in range(0, i):
            if sol[i] == sol[j] or  abs(sol[i] - sol[j]) == abs(i - j):
                return 0
    return 1

def bacc(x):
    global ans
    if x == n :
        if verificare1_ataca(L1,n) != 0:
            ans += 1
            if ans == 1:
                for t in L1:
                    g.write(str(t+1))
                    g.write(' ')
                g.write('\n')
        # verific solutia
    else:
        for i in range(0,n):
            L1[x]=i
            if verificare1_ataca(L1,x+1):
                bacc(x+1)

# back(0,0,0)
bacc(0)
g.write(str(ans))
g.close()