#!/bin/python from collections import defaultdict class Graph: def __init__(self): self.nodes = set() self.edges = defaultdict(list) self.distances = {} def add_node(self, value): self.nodes.add(value) def add_edge(self, from_node, to_node, distance): self.edges[from_node].append(to_node) self.edges[to_node].append(from_node) self.distances[(from_node, to_node)] = distance def dijsktra(graph, initial): visited = {initial: 0} path = {} nodes = set(graph.nodes) while nodes: min_node = None for node in nodes: if node in visited: if min_node is None: min_node = node elif visited[node] < visited[min_node]: min_node = node if min_node is None: break nodes.remove(min_node) current_weight = visited[min_node] for edge in graph.edges[min_node]: weight = current_weight + graph.distances[(min_node, edge)] if edge not in visited or weight < visited[edge]: visited[edge] = weight path[edge] = min_node return visited,path import sys def PossibleMove(n,a,b,i,j): if (i+a=0)&(j+b>=0): return True else: return False return Matrix def MatrixOutput(n,Matrix): for i in range(n): for j in range(n): print Matrix[i][j], print n = int(raw_input().strip()) for a in range(1,n): for b in range(1,n): Chessboard=Graph() k=0 for i in range(n**2): Chessboard.add_node(k) k+=1 for i in range(n): for j in range(n): if PossibleMove(n,i,j,a,b):Chessboard.add_edge(n*i+j,n*(i+a)+(j+b),1) if PossibleMove(n,i,j,-a,b):Chessboard.add_edge(n*i+j,n*(i-a)+(j+b),1) if PossibleMove(n,i,j,a,-b):Chessboard.add_edge(n*i+j,n*(i+a)+(j-b),1) if PossibleMove(n,i,j,-a,-b):Chessboard.add_edge(n*i+j,n*(i-a)+(j-b),1) if PossibleMove(n,i,j,b,a):Chessboard.add_edge(n*i+j,n*(i+b)+(j+a),1) if PossibleMove(n,i,j,-b,a):Chessboard.add_edge(n*i+j,n*(i-b)+(j+a),1) if PossibleMove(n,i,j,b,-a):Chessboard.add_edge(n*i+j,n*(i+b)+(j-a),1) if PossibleMove(n,i,j,-b,-a):Chessboard.add_edge(n*i+j,n*(i-b)+(j-a),1) visited, path=dijsktra(Chessboard,0) try: print visited[n**2-1], except KeyError: print -1, del Chessboard print # your code goes here