Tìm kiếm Leapers


19

Gần đây tôi có một bàn cờ bất thường thực sự kỳ lạ. Các ô vuông của nó ở khắp mọi nơi và thậm chí không được kết nối. Ít nhất là chúng vẫn được đặt trên một lưới thông thường. Tôi muốn điều chỉnh các quy tắc cờ vua để có thể chơi trên bàn cờ, nhưng để bắt đầu, tôi cần một quân cờ thực sự có thể đi bất cứ nơi nào trên bàn cờ, và có vẻ như một người chơi cá cược là lựa chọn tốt nhất của tôi cho điều đó.

Leapers là khái quát cờ vua cổ tích của các hiệp sĩ. Leapers được tham số hóa bởi hai số nguyên mn và có thể di chuyển m bình phương theo một hướng và sau đó n bình phương khác theo hướng vuông góc. Đối với hiệp sĩ tiêu chuẩn, chúng ta có (m, n) = (2, 1) . Toàn bộ di chuyển được coi là một bước nhảy duy nhất sao cho không có ô vuông nào trên đường đến mục tiêu cần phải trống hoặc thậm chí tồn tại.

Các thách thức

Bạn được cấp một "bàn cờ" dưới dạng một danh sách các tọa độ nguyên 2D dương đại diện cho các ô vuông là một phần của bàn cờ. Nhiệm vụ của bạn là tìm một người nhảy, trong đó di chuyển đủ, có thể đến bất kỳ hình vuông nào trên bảng.

Hãy xem xét một số ví dụ. Bàn cờ tiêu chuẩn sử dụng một lưới 8 ô vuông thông thường (lưu ý rằng chúng ta không phân biệt ô vuông trắng và đen cho thử thách này):

########
########
########
########
########
########
########
########

Các hiệp sĩ tiêu chuẩn có thể đạt được tất cả những điều đó, vì vậy (2, 1)sẽ là một đầu ra hợp lệ. Tuy nhiên, (1, 1)ví dụ sẽ không hợp lệ, vì một mảnh như vậy chỉ có thể đạt tới một nửa số ô vuông bất kể nó bắt đầu từ đâu. (1, 0)mặt khác cũng sẽ là một đầu ra hợp lệ, vì tất cả các hình vuông được kết nối trực giao.

Bây giờ nếu chúng ta có một bảng không thường xuyên như:

#   #
 # # #
  # # #
 # #
    #

Sau đó, các giải pháp có thể là (1, 1)(3, 1). Chúng tôi cũng có thể có một bảng với các khu vực hoàn toàn bị ngắt kết nối như:

#### ####
#### ####
#### ####
#### ####

Các hiệp sĩ tiêu chuẩn (2, 1)vẫn có thể tiếp cận tất cả các ô vuông ở đây, đây thực sự là giải pháp duy nhất.

Và cuối cùng, bảng đơn giản sau đây hoàn toàn không thể đạt được bởi bất kỳ người chơi cờ nào:

#
 ##

Lưu ý rằng định dạng đầu vào sẽ không phải là đại diện ASCII mà là danh sách tọa độ thay thế. Ví dụ, ví dụ thứ hai ở trên có thể được đưa ra là:

[[1, 1], [5, 1], [2, 2], [4, 2], [6, 2], [3, 3], [5, 3], [7, 3], [2, 4], [4, 4], [5, 5]]

Quy tắc

Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và xuất kết quả qua tham số STDOUT (hoặc thay thế gần nhất), tham số trả về hàm hoặc tham số hàm (out).

Các tọa độ đầu vào có thể được lấy theo bất kỳ định dạng danh sách thuận tiện nào (danh sách phẳng, danh sách các cặp, danh sách các số nguyên phức, chuỗi có dấu phân cách nhất quán, v.v.).

Đầu ra phải là hai số nguyên mn xác định số nguyên nếu một giải pháp tồn tại (như hai số nguyên riêng biệt, một danh sách, một chuỗi với dấu phân cách không phải là số, v.v.). Nếu không có giải pháp nào tồn tại, bạn có thể xuất ra bất kỳ giá trị nhất quán nào có thể không phải là một đơn vị hợp lệ. Điều này bao gồm cặp số nguyên (0, 0)ở định dạng thông thường của bạn, cũng như bất kỳ số nguyên nào không phải là một cặp số nguyên không âm.

Chương trình của bạn cần xử lý bất kỳ trường hợp thử nghiệm nào trong vòng một phút . Đây là một hạn chế hơi mờ, nhưng sử dụng thông thường: nếu mất 2 phút trên máy của bạn, tôi nghĩ rằng chúng ta có thể giả sử rằng nó có thể chạy trong vòng 1 trên người khác, nhưng nếu mất 20 thì ít khả năng hơn. Không khó để giải quyết từng trường hợp thử nghiệm trong vài giây, vì vậy quy tắc này chỉ có tác dụng loại trừ lực lượng vũ phu ngây thơ.

Luật tiêu chuẩn được áp dụng.

Các trường hợp thử nghiệm

Mỗi trường hợp thử nghiệm có dạng board => all valid leapers. Hãy nhớ rằng bạn chỉ cần xuất một trong số đó. Nếu danh sách những người nhảy vọt trống, hãy đảm bảo trả lại một cái gì đó không phải là một người nhảy hợp lệ.

Examples above:
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [2, 8], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [3, 8], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [4, 8], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [5, 8], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [6, 8], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7], [7, 8], [8, 1], [8, 2], [8, 3], [8, 4], [8, 5], [8, 6], [8, 7], [8, 8]] => [[0, 1], [1, 2], [1, 4], [2, 3], [3, 4]]
[[1, 1], [5, 1], [2, 2], [4, 2], [6, 2], [3, 3], [5, 3], [7, 3], [2, 4], [4, 4], [5, 5]] => [[1, 1], [1, 3]]
[[1, 1], [2, 2], [3, 2]] => []
[[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2], [2, 3], [2, 4], [3, 1], [3, 2], [3, 3], [3, 4], [4, 1], [4, 2], [4, 3], [4, 4], [6, 1], [6, 2], [6, 3], [6, 4], [7, 1], [7, 2], [7, 3], [7, 4], [8, 1], [8, 2], [8, 3], [8, 4], [9, 1], [9, 2], [9, 3], [9, 4]] => [[1, 2]]

Square boards:
[[1, 1], [1, 2], [2, 1], [2, 2]] => [[0, 1]]
[[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]] => [[0, 1]]
[[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2], [2, 3], [2, 4], [3, 1], [3, 2], [3, 3], [3, 4], [4, 1], [4, 2], [4, 3], [4, 4]] => [[0, 1], [1, 2]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5]] => [[0, 1], [1, 2]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6]] => [[0, 1], [1, 2], [2, 3]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7]] => [[0, 1], [1, 2], [2, 3]]

Miscellaneous:
[[1, 1], [2, 1]] => [[0, 1]]
[[1, 1], [1, 2]] => [[0, 1]]
[[1, 1], [12, 35]] => [[11, 34]]
[[1, 1], [1, 2], [2, 1], [2, 2], [6, 1], [6, 2], [6, 3], [6, 4], [7, 1], [7, 2], [7, 3], [7, 4], [8, 1], [8, 2], [8, 3], [8, 4], [9, 1], [9, 2], [9, 3], [9, 4]] => []
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 1], [3, 2], [3, 5], [3, 6], [4, 1], [4, 2], [4, 5], [4, 6], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6]] => [[0, 1], [1, 2], [1, 4]]
[[2, 2], [2, 4], [2, 6], [2, 8], [4, 2], [4, 4], [4, 6], [4, 8], [6, 2], [6, 4], [6, 6], [6, 8], [8, 2], [8, 4], [8, 6], [8, 8]] => [[0, 2], [2, 4]]

Random boards:
[[1, 5], [1, 9], [2, 6], [2, 8], [2, 10], [2, 12], [3, 5], [3, 7], [3, 9], [3, 11], [3, 13], [4, 2], [4, 4], [4, 6], [4, 8], [4, 14], [5, 1], [5, 3], [5, 5], [5, 7], [6, 2], [6, 4], [7, 1], [8, 2]] => [[1, 1], [1, 3]]
[[1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 1], [2, 2], [2, 3], [2, 4], [2, 7], [3, 1], [3, 2], [3, 3], [3, 4], [3, 6], [3, 7], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [5, 3], [5, 4], [5, 6]] => [[0, 1], [1, 2]]
[[1, 8], [2, 6], [2, 10], [3, 3], [3, 4], [3, 8], [4, 1], [4, 11], [5, 3], [5, 9], [6, 12], [8, 11], [10, 10], [11, 12], [12, 6], [12, 8], [13, 6], [13, 8], [13, 10], [13, 11], [14, 5], [14, 7], [14, 8], [14, 13], [14, 14], [15, 7], [15, 9], [15, 11], [15, 12], [16, 6], [16, 7], [16, 9], [16, 13], [16, 14], [17, 10], [17, 12], [18, 8], [18, 12], [20, 9], [21, 11], [22, 13], [23, 10], [23, 11], [23, 15], [24, 12]] => [[1, 2]]
[[1, 17], [1, 21], [3, 11], [3, 15], [3, 19], [3, 23], [5, 13], [5, 21], [7, 11], [7, 15], [7, 19], [9, 1], [9, 13], [9, 17], [11, 3], [11, 7], [11, 15], [11, 19], [13, 5], [13, 9], [13, 13], [13, 17], [13, 21], [15, 11], [15, 15], [15, 19], [17, 13], [17, 17]] => [[2, 2], [2, 6], [2, 10]]
[[1, 3], [2, 4], [2, 5], [3, 6], [4, 1], [5, 3], [5, 6], [5, 7], [6, 12], [6, 14], [6, 21], [7, 9], [7, 19], [8, 9], [8, 15], [8, 17], [8, 18], [8, 24], [9, 12], [9, 19], [10, 12], [10, 14], [10, 17], [10, 21], [11, 22], [12, 15], [12, 17], [12, 24], [13, 16], [14, 20], [14, 21], [14, 26], [15, 13], [15, 19], [16, 18], [16, 23], [17, 16], [17, 24]] => [[2, 3]]
[[1, 11], [3, 13], [4, 10], [6, 14], [8, 12], [9, 9], [9, 15], [12, 8], [13, 5], [13, 19], [13, 21], [14, 8], [15, 1], [15, 17], [16, 4], [16, 14], [16, 18], [16, 20], [17, 21], [18, 2], [18, 16], [18, 18], [19, 9], [19, 13], [19, 15], [20, 12], [21, 1], [21, 17], [22, 4], [22, 10], [23, 7]] => [[1, 3]]
[[1, 39], [6, 37], [8, 32], [10, 27], [11, 31], [11, 35], [12, 22], [16, 21], [16, 29], [16, 33], [18, 34], [21, 3], [21, 9], [21, 19], [23, 8], [23, 14], [23, 22], [23, 24], [23, 36], [24, 6], [25, 13], [25, 17], [26, 1], [26, 11], [28, 6], [28, 20], [28, 26], [28, 30], [28, 34], [30, 11], [30, 15], [30, 21], [32, 6], [33, 28], [33, 32], [35, 13], [35, 23]] => [[2, 5]]

Trong trường hợp đặc biệt, lưu ý rằng đối với một bảng chỉ bao gồm một ô, bất kỳ bộ đệm nào hoạt động, nhưng đầu ra của bạn phải tương ứng với một bộ đệm thực tế, do đó [0, 0]không phải là đầu ra hợp lệ.


Câu hỏi nhanh. Một hiệp sĩ (2,1)thế nào? Chỉnh sửa cho tôi nếu tôi sai, nhưng tôi khá chắc chắn các hiệp sĩ có thể di chuyển 3 hình vuông theo bất kỳ một hướng nào, và sau đó 1 hình vuông theo bất kỳ hướng vuông góc với hướng trước đó, vì vậy nó nên thay thế (3,1).
R. Kap

1
@ R.Kap Bạn sai rồi. ;) vi.wikipedia.org/wiki/Knight_(chess)#Movement
DLosc

@DLosc Ok, wow. Tôi đoán tôi đã. Cảm ơn vì điều đó!
R. Kap

Chúng tôi có thể xuất tất cả các bước nhảy hợp lệ trong một danh sách? Nếu chúng ta làm, chúng ta có thể xuất những bước nhảy tương đương như thế [[1, 0], [0, 1]]nào?
FryAmTheEggman

@FryAmTheEggman Chỉ cần (bất kỳ) một trong số họ, xin vui lòng.
Martin Ender

Câu trả lời:


12

Bình thường 41 35

hfqQu@+G+VM*s_BM*F_BMTGQ]hQ)maVhQdt

Thoát khỏi lỗi nếu không có bước nhảy hợp lệ, đưa ra chuỗi trống nếu STDERR bị bỏ qua.

Dùng thử tại đây hoặc chạy Test Suite

Đã lưu 6 byte nhờ isaacg ! Về cơ bản chỉ cần tìm tất cả các ứng cử viên bằng cách chọn từng đơn vị hợp lệ từ ô đầu tiên sang ô khác. Sau đó, đối với mỗi trong số đó, nó làm cho tất cả tám cấu hình [x, y]bù đắp mà người chơi có thể thực hiện. Sau đó, nó tìm thấy tất cả các di chuyển bắt đầu từ ô đầu tiên theo sau di chuyển và loại bỏ những di chuyển không có trong đầu vào. Nó tiếp tục làm điều này cho đến khi kết quả không thay đổi. Nếu danh sách cuối cùng này giống với đầu vào thì tờ rơi đã hợp lệ.

Bàn cờ tiêu chuẩn mất nhiều thời gian nhất khi tôi đang thử nghiệm, mất khoảng 3 giây trên máy tính không mấy ấn tượng của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.