Da du nicht beschreibst, wie du das Problem gelöst haben möchtest, hier ein (sehr naiver) algorithmischer Ansatz in Python:
def removeDuplicates(l):
result = []
for x in l:
if x not in result:
result.append(x)
return result
def generateKnightsGraph(size):
graph = dict()
for i in range(size):
for j in range(size):
legalMoves = [ ((i+2)%size, (j+1)%size),
((i+2)%size, (j-1)%size),
((i+1)%size, (j-2)%size),
((i-1)%size, (j-2)%size),
((i-2)%size, (j-1)%size),
((i-2)%size, (j+1)%size),
((i-1)%size, (j+2)%size),
((i+1)%size, (j+2)%size) ]
graph[(i,j)] = removeDuplicates(legalMoves)
return graph
def s(start, dest, knightsgraph):
queue = []
visited = dict.fromkeys(knightsgraph, False)
queue.append( [start, 0] )
visited[start] = True
while len(queue) != 0:
node, depth = queue.pop(0)
visited[node] = True
if node == dest:
return depth
else:
for move in knightsgraph[node]:
if not visited[move]:
queue.append( [move, depth + 1] )
return -1
def S(size):
kg = generateKnightsGraph(size)
maximum = -1
for i in range(size):
for j in range(size):
for k in range(size):
for l in range(size):
maximum = max(maximum, s((i,j), (k,l), kg))
return maximum
if __name__ == '__main__':
print(S(8))
Für die Funktion s(k,l) wird Breitensuche verwendet.
Das Programm liefert:
a) S(4) = 4, S(8) = 4
b) S(4) > S(5) = 2 aber 4 < 5