Đề bài
Với mỗi kích thước bàn cờ k từ 1 đến n, hãy đếm số cặp ô phân biệt không có thứ tự trên bàn cờ k x k mà hai quân mã không thể tấn công nhau. Một quân mã di chuyển hai ô theo một trục và một ô theo trục còn lại.
. x . x .
x . . . x
. . K . .
x . . . x
. x . x .K đánh dấu vị trí quân mã và x là các ô mà quân mã có thể di chuyển tới, nếu các ô đó nằm trong bàn cờ. Đổi chỗ hai quân mã không tạo ra một cách đặt khác.
Cài đặt hàm two_knights(n).
Đầu vào
n: Kích thước bàn cờ lớn nhất cần xét.
Đầu ra
Trả về n số lượng theo thứ tự, ứng với các kích thước bàn cờ từ 1 đến n.
Ràng buộc
1 ≤ n ≤ 10.000. Kết quả đếm vừa với số nguyên có dấu 64-bit.
Ví dụ
Đầu vào:
n = 3
Kết quả mong đợi:
expected = [0, 6, 28]
Đầu vào:
long long n = 3;
Kết quả mong đợi:
std::vector<long long> expected = {0, 6, 28};
Đầu vào:
long n = 3;
Kết quả mong đợi:
long[] expected = new long[] {0, 6, 28};
Giải thích
Bàn cờ 1 × 1 không thể đặt hai quân mã. Bàn cờ 2 × 2 có sáu cặp ô và không có trường hợp nào bị tấn công. Bàn cờ 3 × 3 có 36 cặp ô, trong đó tám cặp bị tấn công, còn lại 28 cặp an toàn.
Đầu vào:
n = 1
Kết quả mong đợi:
expected = [0]
Đầu vào:
long long n = 1;
Kết quả mong đợi:
std::vector<long long> expected = {0};
Đầu vào:
long n = 1;
Kết quả mong đợi:
long[] expected = new long[] {0};
Giải thích
Cần hai ô phân biệt, nhưng bàn cờ chỉ có một ô.
Hướng tiếp cận
Hãy tự thử trước, sau đó mở từng gợi ý một.
Gợi ý 1
Bắt đầu từ tất cả các cặp ô không thứ tự trên mỗi bàn cờ, rồi trừ đi các cặp mà quân mã tấn công nhau.
Gợi ý 2
Chỉ có một số rất ít cách đặt quân mã tấn công nhau lọt trong mỗi hình chữ nhật 2 by 3 hoặc 3 by 2.
Gợi ý 3
Các bàn cờ biên như 1 by 1 và 2 by 2 phải tự nhiên cho ra 0 cặp tấn công.
Độ phức tạp mong đợi
thời gian O(n), bộ nhớ phụ O(1)
Tham khảo
Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.