import sys trial = 0 Knight_x = [-2, -2, -1, -1, 1, 1, 2, 2] Knight_y = [-1, 1, -2, 2, -2, 2, -1, 1] def view(matrix): for x in range(0, 8): for y in range(0, 8): print("{0:2d}".format(matrix[x][y]), end=" ") print() return 0 def move(matrix, count, pos_x, pos_y, moves): "次の一手を探す関数" # print("DEBUG: {0:d} ({1:d}, {2:d})".format(count, pos_x, pos_y)) for shift in range(0, 8): x = pos_x + Knight_x[shift] y = pos_y + Knight_y[shift] if x < 0 or x >= 8 or y < 0 or y >= 8: continue # 既に訪れたマスであれば次へ if matrix[x][y] > 0: continue # 動けるマスであれば、そこに動く matrix[x][y] = count # これが 64 手目であれば、チェス盤を全て埋めたので終了 if count == 64 or count + 1 == moves: view(matrix) sys.exit(0) move(matrix, count + 1, x, y, moves) # 上の move() がチェス盤を埋め尽くして終了 (sys.exit(0)) した場合は、ここより下は実行されない # 今の手を取り消して、続きを検索する matrix[x][y] = 0 continue return -1 # square: 既に訪れたマスなら 1 以上, 未だ訪れていないマスなら 0 square = [[0 for i in range(0,8)] for j in range(0,8)] # 適切な初期座標が与えられていなければエラーメッセージを表示して終了 if len(sys.argv) != 4: print ("Usage: python {0:s} initial_x initial_y moves".format(sys.argv[0])) sys.exit(1) initial_x = int(sys.argv[1]) initial_y = int(sys.argv[2]) moves = int(sys.argv[3]) if initial_x < 0 or initial_x >= 8: print ("Error: initial_x must be between 0 and 7.") sys.exit(1) if initial_y < 0 or initial_y >= 8: print ("Error: initial_y must be between 0 and 7.") sys.exit(1) print ("The initial location is ({0:d}, {1:d}).".format (initial_x, initial_y)) square[initial_x][initial_y] = 1 move(square, 2, initial_x, initial_y, moves)