top = [2,1,2,3,3]
left = [2,1,4,2,2]
right = [4,3,1,2,2]
bottom = [2,5,2,1,3]
n = 5

debug = False

grid = [[2,5,4,3,1],
        [5,4,1,2,3],
        [1,3,2,4,5],
        [3,2,5,1,4],
        [4,1,3,5,2]]

grid = [[0 for i in range(n)] for j in range(n)]

def printgrid(grid):
    for i in range(len(grid)):
        print(grid[i])

def rowdiff(fred):
    for i in range(len(fred)):
        if fred[i] != 0:
            for j in range(i+1, len(fred)):
                if fred[i] == fred[j]:
                    return False
    return True

def checkGrid(grid):
    for i in range(len(grid)):
        if rowdiff(grid[i]) == False:
            return False
    
    if debug: print("-"*50)
    for col in range(len(grid)):
        column = [grid[i][col] for i in range(n)]
        if rowdiff(column) == False:
            return False
    if debug: print("-"*50)
    for i in range(len(grid)):
        if count(grid[i], left[i]) == False:
            return False
    if debug: print("-"*50)
    for i in range(len(grid)):
        rRow = grid[i][:]
        rRow.reverse()
        if count(rRow, right[i]) == False:
            return False
    if debug: print("-"*50)
    for col in range(len(grid)):
        column = [grid[i][col] for i in range(n)]
        if count(column, top[col]) == False:
            return False
    if debug: print("-"*50)
    for col in range(len(grid)):
        bCol = [grid[i][col] for i in range(n)]
        bCol.reverse()
        if count(bCol, bottom[col]) == False:
            return False
    return True
    
def checkVis(l,index):
    for i in range(index):
        if l[i] >= l[index]:
            return False
    return True    


def count(line,clue):
    if debug: print(line)
    if debug: print(clue)
    counter = 0
    stopEarly = False
    for i in range(len(line)):
        if line[i] == 0:
            stopEarly = True
            break
        if checkVis(line, i):
            counter += 1
    if debug: print(counter)
            
    if stopEarly:
        if counter > clue:
            #print(counter)
            return False
    else:
        if counter != clue:
            #print(counter)
            return False
    return True

def DFSearch(grid,row,col):
    for val in range(1,n+1):
        if debug: print("trying out " + str(val))
        grid[row][col] = val
        if checkGrid(grid):
            #row2, col2 where next 0 is 
            col2 = col + 1
            row2 = row
            if col2 == n:
                col2 = 0
                row2 = row + 1
            if row2 == n:
                printgrid(grid)
                return True
            solutionFound = DFSearch(grid,row2,col2)
            if solutionFound:
                return True
    grid[row][col] = 0
    return False



column = [grid[i][0] for i in range(n)]

if debug: printgrid(grid)
if debug: print(checkGrid(grid))
DFSearch(grid,0,0)

#print(checkVis(grid[0],1))
#print(count(grid[0],2))
#print(count(myList,2))

