Quay lại danh sách thử thách
Trung bình 0 đã giải Tỷ lệ chấp nhận 0%

Hai Mã Không Tấn Công Nhau

Đếm số cách đặt an toàn hai quân mã cho mỗi kích thước bàn cờ vuông.

Bạn sẽ học được gì

  • Đếm mọi cách đặt bằng tổ hợp
  • Trừ đi các vị trí tấn công nhau
  • Tìm công thức đóng cho mỗi kích thước bàn cờ

Đề bài

Xem bản gốc (English)

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ụ

Ví dụ 1
Đầ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.

Ví dụ 2
Đầ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.

Học hỏi từ người khác

Giải pháp cộng đồng

Chưa có giải pháp nào được chia sẻ. Hãy giải thử thách này để đăng giải pháp đầu tiên.