Người định cư của Catan - Con đường dài nhất!


16

Đây là một hội đồng kết thúc của Settlers of Catan:

Bảng Catan

Lý lịch:

Các con đường (các thanh dài) và các khu định cư (và thành phố) được hiển thị bởi các túp lều nhỏ. Chúng tôi mã hóa vị trí của các mảnh này bằng cách sử dụng sơ đồ sau: Từ đỉnh, chúng tôi có một hàng ngang và các cạnh ngang nơi có thể đặt đường. Sau đó, chúng tôi có một cột chỉ các con đường, và vv. Sử dụng R cho Red, O cho Orange và B cho Blue và _ không có gì, bảng hình sẽ được mã hóa thành:

________RR_R_
__R_
__RR_R_RRR_____R_
B___R
_B_________B__OO_OOR_
B__B_R
BB_BBB_____B____RR_R_
OBB_O
OO__BB_BB__OOO_OO
O_O_
_O_OOO_O_____

Một bảng như thế này sẽ là chuỗi đầu vào của bạn. Bất kỳ chữ cái nào [A-Z]cũng có thể chỉ ra màu của người chơi, nhưng sẽ có tối đa bốn màu (bao gồm cả trống). Các bảng khác được đảm bảo là hợp lệ theo các quy tắc của Người định cư, có nghĩa là:

  • Mỗi màu sẽ có tối đa hai mạng lưới đường tiếp giáp nhau, có thể hoặc không thể bị phá vỡ bởi các khu định cư / thành phố khác (các tòa nhà trên đỉnh). Xem độ lún màu cam phá vỡ con đường màu đỏ ở phía bên phải của hình ảnh mẫu.
    • Mỗi mạng lưới đường được đảm bảo có ít nhất một khu định cư.
  • Tất cả các khu định cư và thành phố được đảm bảo ít nhất hai cạnh so với khu định cư / thành phố khác gần nhất (của bạn hoặc cách khác)
  • Một người chơi chỉ có thể có 15 đường trên bảng trò chơi.
  • Đối với những người đam mê Catan: không có sự phân biệt giữa các khu định cư và thành phố cho mục đích của vấn đề này, vì vậy tôi không phân biệt trong chuỗi đầu vào.

Tất cả điều này là dành cho đặc điểm kỹ thuật của chuỗi "đầu vào".

Con đường dài nhất:

Trong Settlers, người chơi có được hai điểm chiến thắng vì có "con đường dài nhất". Điều này được xác định là: Đường đơn tiếp giáp dài nhất (tính theo đường) từ điểm bắt đầu đến điểm kết thúc, không bị phá vỡ bởi một khu định cư của đối thủ hoặc thành phố . Chu kỳ là ổn, miễn là bạn có thể theo dõi đường dẫn từ một điểm bắt đầu cụ thể đến một điểm kết thúc cụ thể. Vì vậy, một vòng gồm 6 con đường cộng với một con đường rẽ nhánh là chiều dài 7, nhưng một con đường có hai nhánh rẽ vào vòng 6 con đường ở hai phía đối diện vẫn chỉ có giá trị 7.

Trong bản đồ ví dụ, con đường Đỏ ở phía bên phải chỉ có giá trị 4, bởi vì anh ta bị cắt bởi một khu định cư Orange ở phía bên phải của bảng (đó là lý do tại sao các khu định cư được bao gồm). Blue có đường dài 13 và Orange có đường dài 12. Đường trên cùng của Red chỉ có giá trị 7, vì nó không kết nối với hai đường duy nhất bên cạnh.

Đầu ra:

Tất cả những người chơi có một con đường có độ dài dài nhất (có thể nhiều hơn một nếu có mối quan hệ), theo sau là khoảng trắng và / hoặc số vạch giới hạn dưới cơ sở trong khoảng 10 của con đường đó.

Vì vậy, đầu ra cho bảng ví dụ sẽ là:

B 13

Báo cáo vấn đề:

Bạn có thể viết chương trình hoặc hàm , nhận bảng đầu vào thông qua STDIN hoặc làm đối số chuỗi cho hàm của bạn, trả về đầu ra được mô tả ở trên dưới dạng chuỗi hoặc in ra STDOUT (hoặc thay thế gần nhất). Bạn có thể tùy ý bao gồm một dòng mới duy nhất trong đầu ra.

Đây là , chương trình chiến thắng ngắn nhất. Tất nhiên, sơ hở bị cấm .


2
Các vấn đề thực sự tuyên bố: Orange player là một jerk.
corsiKa

From the top, we have a row horizontal vertices and edges where a road can be placed. Then we have a column of only roads, and so forth. Tôi mất vài phút để tìm hiểu điều này có nghĩa là gì. Bạn nên giải thích rõ hơn rằng các hàng ngang cũng bao gồm các khu định cư và địa điểm định cư.
DLosc

@corsiKa Tôi đã có người làm điều đó với tôi trước đây!
Jerry Jeremiah

1
Màu cam và đỏ trong hình ảnh thực sự giống nhau. Bạn nên chọn màu khác.
mbomb007

Câu trả lời:


3

Python 2, 445 400 byte

Tôi là một fan hâm mộ của Settlers, vì vậy thử thách này rất thú vị.

T="^"
Z=26
A=T*52
for i in range(11):A+=(T*(i%2)*3).join(x for x in raw_input()).center(Z,T)
A+=T*52
def f(c,p=0,l=0,B=A):
 b=l;C=B[0:p]+T+B[p+1:];n=(Z,1)[p%2]
 for i in(p<1)*range(390):
    if(i/Z%2<1&i%2>0)|(i/Z%2>0&i%2<1):b=max(b,f(c,i))
 for i in(p-n,p+n)*(B[p]==c):
    for j in(i-Z,i-1,i+1,i+Z)*(B[i]in c+"_"):b=max(b,f(c,j,l+1,C))
 return b
i=l=0
for x in A:
 if x<T:i=f(x)
 if i>l:c=x;l=i
print c,l

Điểm số phản ánh thay thế mỗi lần xuất hiện của 4 khoảng trắng bằng một tab.

Giải trình

Các dòng trước định nghĩa hàm đọc đầu vào và xây dựng một bảng chuẩn hóa thành một biến chuỗi đơn. Quá trình chèn các ký tự "^" vào các dòng ngắn biểu thị các đoạn đường dọc. Nó cũng đệm bảng với các ký tự "^".

^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^________RR_R_^^^^^^^
^^^^^^_^^^_^^^R^^^_^^^^^^^
^^^^__RR_R_RRR_____R_^^^^^
^^^^B^^^_^^^_^^^_^^^R^^^^^
^^_B_________B__OO_OOR_^^^
^^B^^^_^^^_^^^B^^^_^^^R^^^
^^BB_BBB_____B____RR_R_^^^
^^^^O^^^B^^^B^^^_^^^O^^^^^
^^^^OO__BB_BB__OOO_OO^^^^^
^^^^^^O^^^_^^^O^^^_^^^^^^^
^^^^^^_O_OOO_O_____^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^

Khi được gọi với các tham số mặc định, hàm sẽ trả về độ dài của đường có màu nhất định. Vòng lặp đầu tiên chỉ hoạt động khi tham số vị trí (p) được cung cấp. Nó đệ quy tìm thấy chiều dài của con đường tại mỗi vị trí đường hợp lệ và theo dõi vị trí dài nhất. Khi có một con đường ở tham số vị trí, hàm sẽ đệ quy thêm chiều dài của các đường liền kề cùng màu. Con đường được thay thế bằng "~" trong bản sao làm việc của bảng để đảm bảo nó không kể lại các phân đoạn đã được tính.

Mã theo định nghĩa hàm gọi hàm cho từng màu trong bảng và in màu và độ dài cho điểm cao nhất.

Demo nó ở đây

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.