"""BTVN: Mã đi tuần bằng quay lui, thứ tự thử theo SGV, Python3.

python3 g11-cs-ma-di-tuan.py 8 0 0
Các tham số lần lượt là n, hàng xuất phát, cột xuất phát (chỉ số0..n-1).
Bản thực hành nhận n1..8. Tìm kiếm có thể lâu tùy điểm xuất phát.
"""
import argparse


def isOK(row, col, board):
    n = len(board)
    return 0 <= row < n and 0 <= col < n and board[row][col] == -1


def knightTraverse(n, board, row, col, pos):
    if pos == n * n:
        return True
    move_row = [2, 1, -1, -2, -2, -1, 1, 2]
    move_col = [1, 2, 2, 1, -1, -2, -2, -1]
    for i in range(8):
        next_row = row + move_row[i]
        next_col = col + move_col[i]
        if isOK(next_row, next_col, board):
            board[next_row][next_col] = pos
            if knightTraverse(n, board, next_row, next_col, pos + 1):
                return True
            board[next_row][next_col] = -1
    return False


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('n', type=int)
    parser.add_argument('row', type=int)
    parser.add_argument('col', type=int)
    args = parser.parse_args()
    if not 1 <= args.n <= 8 or not (0 <= args.row < args.n and 0 <= args.col < args.n):
        parser.error('Nhận n1..8 và vị trí trong bàn cờ.')
    board = [[-1 for _ in range(args.n)] for _ in range(args.n)]
    board[args.row][args.col] = 0
    if knightTraverse(args.n, board, args.row, args.col, 1):
        print('Hành trình tìm được:')
        for row in board:
            print(*row)
    else:
        print('Không có hành trình hợp lệ.')


if __name__ == '__main__':
    main()
