import sys Knight_x = [-2, -2, -1, -1, 1, 1, 2, 2] Knight_y = [-1, 1, -2, 2, -2, 2, -1, 1] Size_x = 8 Size_y = 8 N_max = -1 def view(matrix): for y in range(0, Size_y): for x in range(0, Size_x): 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 >= Size_x or y < 0 or y >= Size_y: 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 y in range(0, Size_y): for x in range(0, Size_x): 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 >= Size_x or y < 0 or y >= Size_y: continue # 既に訪れたマスであれば次へ if matrix[x][y] > 0: continue # 動けるマスであれば、そこに動く matrix[x][y] = count # 動いた結果として手詰まりになるなら次へ if dead(matrix, x, y): matrix[x][y] = 0 continue # チェス盤を全て埋めたなら 0 を返す if count == n_square: results += 1 if results == N_max: print(results, "solutions found.") view(matrix) sys.exit(0) matrix[x][y] = 0 return 0 move(matrix, count + 1, x, y) # 今の手を取り消して、続きを検索する matrix[x][y] = 0 continue return -1 results = 0 # 適切な引数が与えられていなければエラーメッセージを表示して終了 if len(sys.argv) != 6: print ("Usage: python {0:s} size_x size_y results initial_x initial_y".format(sys.argv[0])) sys.exit(1) Size_x = int(sys.argv[1]) Size_y = int(sys.argv[2]) N_max = int(sys.argv[3]) initial_x = int(sys.argv[4]) initial_y = int(sys.argv[5]) if Size_x < 1 or Size_y < 1: print ("Error: size_x and size_y must be higher than 0.") sys.exit(1) if initial_x < 0 or initial_x >= Size_x: print ("Error: initial_x must be between 0 and {0:d}.".format(size_x - 1)) sys.exit(1) if initial_y < 0 or initial_y >= Size_y: print ("Error: initial_y must be between 0 and {0:d}.".format(size_y - 1)) sys.exit(1) n_square = Size_x * Size_y print ("The initial location is ({0:d}, {1:d}).".format (initial_x, initial_y)) # square: 既に訪れたマスなら 1 以上, 未だ訪れていないマスなら 0 square = [[0 for i in range(0, Size_y)] for j in range(0, Size_x)] square[initial_x][initial_y] = 1 move(square, 2, initial_x, initial_y) print(results, "solutions found.")