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 route(matrix, pos_x, pos_y, cur_x, cur_y): count = 0 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 x == cur_x and y == cur_y: count += 1 continue if matrix[x][y] == 0: count += 1 return count def dead(matrix, cur_x, cur_y): count = 0 for x in range(0, 8): for y in range(0, 8): if matrix[x][y] > 0: continue n = route(matrix, x, y, cur_x, cur_y) if n == 0: return 1 if n == 1: count += 1 if count > 1: return 1 return 0 def move(matrix, count, pos_x, pos_y): "次の一手を探す関数" global results 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 # 動いた結果として手詰まりになるなら次へ if dead(matrix, x, y): matrix[x][y] = 0 continue # これが 64 手目であれば、チェス盤を全て埋めたので 0 を返す if count == 64: results += 1 if results == 100000: sys.exit(0) matrix[x][y] = 0 return 0 # view(matrix) # sys.exit(0) move(matrix, count + 1, x, y) # 今の手を取り消して、続きを検索する matrix[x][y] = 0 continue return -1 results = 0 # square: 既に訪れたマスなら 1 以上, 未だ訪れていないマスなら 0 square = [[0 for i in range(0,8)] for j in range(0,8)] # 適切な初期座標が与えられていなければエラーメッセージを表示して終了 if len(sys.argv) != 3: print ("Usage: python {0:s} initial_x initial_y".format(sys.argv[0])) sys.exit(1) initial_x = int(sys.argv[1]) initial_y = int(sys.argv[2]) 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)