-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSolucionNAlfiles.py
75 lines (65 loc) · 2.32 KB
/
SolucionNAlfiles.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
74
75
from pandas import *
import copy
import time
n = 7
solutions = 2**n
def block(x,y,board): # Esta funcion pon e el caracter del alfin en (x,y) y
CurrentBoard = copy.deepcopy(board)
CurrentBoard[x][y] = '♗' # pone una 'x' en todos los lugares a los que ataca
for i in range(n):
if((x-y+i) >= 0 and (x-y+i) < n and i != y):
CurrentBoard[x-y+i][i] = '☐'
if((x+y-i) >= 0 and (x+y-i) < n and i != y):
CurrentBoard[x+y-i][i] = '☐'
return CurrentBoard
def placeBishop(init_i,init_j,board): #Esta funcion busca y pone un alfil el primer lugar disponible apartir de init(i,j)
i = init_i
j = init_j
while (1):
if(board[i][j] == '-'):
block(i,j,board)
print (DataFrame(board))
return [i,j]
else:
i += 1
if(i == n):
j += 1
i = 0
if(j == n):
return 0
break
def getChildrenBoards(CurrentBoard):
children = list()
for i in range(n):
for j in range(n):
if CurrentBoard[i][j] == '-' :
newChildren = block(i,j,CurrentBoard)
CurrentBoard[i][j] = "☐"
children.append(newChildren)
return children
def getNumberOfBishops(CurrentBoard):
bishops = 0
for i in range(n):
for j in range(n):
if CurrentBoard[i][j] == '♗' :
bishops +=1
return bishops
def DFSNBishops(n):
InitialBoard = [ [ '-' for i in range(n) ] for j in range(n) ]
BoardStack = []
Boards = []
BoardStack.append(InitialBoard)
while(len(BoardStack) != 0 and len(Boards) < 2**n):
CurrentBoard = BoardStack.pop()
Children = getChildrenBoards(CurrentBoard)
if(len(Children) == 0 and getNumberOfBishops(CurrentBoard) == 2*(n-1)):
Boards.append(CurrentBoard)
else:
for child in Children:
BoardStack.append(child)
for i,solution in enumerate(Boards):
print("Solucion : ", i+1, " of ",solutions )
print (DataFrame(solution, columns=[chr(ord('A')+i) for i in range (n)], index = range(1,n+1) ))
start_time = time.time()
DFSNBishops(n)
print("--- %s seconds ---" % (time.time() - start_time))