卡坦定居者-最长之路!


16

这是卡坦定居者的残局:

卡坦板

背景:

道路(长棍棒)和居民点(和城市)由小木屋组成。我们使用以下方案对这些片段的放置进行编码:从顶部开始,我们有一排水平顶点和一条可以放置道路的边。然后,我们只有一列道路,依此类推。使用R代表红色,O代表橙色,B代表蓝色,_代表无,图板将被编码为:

________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_____

这样的板将作为您的输入字符串。任何字母都[A-Z]可以指示玩家的颜色,但是最多可以有四种颜色(包括空白)。否则,根据定居者规则,保证董事会有效,这意味着:

  • 每种颜色最多具有两个连续的道路网络,这些道路网络可能会或可能不会被其他玩家居住区/城市(顶点建筑物)分开。看到橙色沉淀物将样品图像右侧的红色道路分开。
    • 保证每个路网至少有一个居民点。
  • 保证所有定居点和城市与最近的其他定居点/城市(您或其他人)至少有两个边缘
  • 一位玩家在游戏板上可能只有15条道路。
  • 对于Catan爱好者:出于此问题的目的,在定居点和城市之间没有区别,因此我在输入字符串中没有区别。

所有这些都是为了指定“输入”字符串。

最长的路:

在定居者中,玩家拥有“最长的道路”可获得两个胜利点。定义为:从起点到终点的最长连续单路径(以道路为单位),不会被对手的定居点或城市分解。只要您可以跟踪从一个特定起点到一个特定终点的路径,循环就可以了。因此,一条6条道路的环路加上一条分支的道路的长度为7,但是一条在两条道路上相对的6条道路分支的两条分支的长度仍为7。

在示例地图中,右侧的红色道路仅价值4,因为板子右侧的橙色解决方案将他切断了(这就是为什么完全包括解决方案的原因)。蓝色的道路长度为13,橙色的道路长度为12。红色的最高道路仅价值7,因为它没有连接到其旁边的两条道路。

输出:

道路最长的所有玩家(如果有平局,则可能会超过一条),然后以空格和/或下划线划定距离(以10为底)。

因此,示例板的输出为:

B 13

问题陈述:

您可以编写程序或函数,通过STDIN或作为函数的字符串参数接收输入板,然后将上述输出作为字符串返回或将其打印到STDOUT(或最接近的输出)。您可以选择在输出中包含单个尾随换行符。

这是,最短的程序获胜。当然,标准漏洞是被禁止的


2
真正的问题陈述:橙色球员是个混蛋。
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. 我花了几分钟才弄清楚这是什么意思。您应该更清楚地说明水平行还包括沉降和沉降位置。
DLosc

@corsiKa我之前曾有人对我这样做!
杰里·耶利米

1
图像中的橙色和红色非常相似。您应该选择其他颜色。
mbomb007 '16

Answers:


3

Python 2,445400字节

我是定居者的粉丝,所以这个挑战很有趣。

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

分数反映了用选项卡替换每次出现的4个空格。

说明

函数定义之前的行读取输入,并将标准化的板构建为单个字符串变量。该过程将“ ^”字符插入代表垂直路段的短线中。它还用“ ^”字符填充董事会。

^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^________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_____^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^

当使用默认参数调用时,该函数返回给定颜色的道路长度。仅当提供位置(p)参数时,第一个循环才有效。它递归地找到每个有效道路位置处的道路长度,并跟踪最长的道路。当位置参数处有道路时,该函数以递归方式添加相同颜色的相邻道路的长度。道路在工作副本中以“〜”代替,以确保不重新计算已经计数的路段。

函数定义之后的代码为板上的每种颜色调用该函数,并打印得分最高的颜色和长度。

在这里演示

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.