我们喜欢我们奇怪的难题,我们英国人


16

在英国的几家报纸上有一种被称为Hidato的游戏。它与Sudoku有点类似,尽管不是在行和块中放置1-9,而是放置数字以使它们从头到尾依次连接,01直到它们都水平,对角线或垂直

输入将包含由分隔的多行\n,其中包含以空格分隔的块,您可以假定它们是两个字符宽。每个块将是一个数字,一个要填充的空白(由表示--)或一面不能在(XX)中具有数字的墙。

您的输出应与提供的一个相匹配,尽管带有带有数字的空块。请注意,可能没有唯一的解决方案,甚至不存在解决方案 -有些解决方案可能由于其含糊不清而产生多个结果,就像Sudoku一样,而有些解决方案实际上是无法解决的,在这种情况下,您应该给出错误的输出,但是您可以假设输入的格式如下。

使用标准标题Language: XX bytes。打高尔夫球快乐!

例子

输入01 XX 0301 -- 0401 --,等应该都是一些回报falsey

输入:

01 -- --
-- XX 05

输出:

01 03 04
02 XX 05

输入:

-- 33 35 -- -- XX XX XX    
-- -- 24 22 -- XX XX XX      
-- -- -- 21 -- -- XX XX
-- 26 -- 13 40 11 XX XX
27 -- -- -- 09 -- 01 XX
XX XX -- -- 18 -- -- XX
XX XX XX XX -- 07 -- --
XX XX XX XX XX XX 05 --

输出:

32 33 35 36 37 XX XX XX
31 34 24 22 38 XX XX XX
30 25 23 21 12 39 XX XX
29 26 20 13 40 11 XX XX
27 28 14 19 09 10 01 XX
XX XX 15 16 18 08 02 XX
XX XX XX XX 17 07 06 03
XX XX XX XX XX XX 05 04

输入:

XX XX XX XX -- 53 XX XX XX XX
XX XX XX XX -- -- XX XX XX XX
XX XX 56 -- -- -- 30 -- XX XX
XX XX -- -- -- -- -- -- XX XX
XX -- -- 20 22 -- -- -- -- XX
XX 13 -- 23 47 -- 41 -- 34 XX
-- -- 11 18 -- -- -- 42 35 37
-- -- -- -- 05 03 01 -- -- --
XX XX XX XX -- -- XX XX XX XX
XX XX XX XX 07 -- XX XX XX XX

输出:

XX XX XX XX 52 53 XX XX XX XX
XX XX XX XX 54 51 XX XX XX XX
XX XX 56 55 28 50 30 31 XX XX
XX XX 26 27 21 29 49 32 XX XX
XX 25 24 20 22 48 45 44 33 XX
XX 13 19 23 47 46 41 43 34 XX
14 12 11 18 04 02 40 42 35 37
15 16 17 10 05 03 01 39 38 36
XX XX XX XX 09 06 XX XX XX XX
XX XX XX XX 07 08 XX XX XX XX

确保我理解:给定一个网格,其中包含一些不可行走的单元格,找到适合预填充单元格的哈密顿路径?
Geobits,2015年

@AmiRuse哇。看起来很棘手。(当然,这来自讨厌照片编辑的人。)很高兴认识这里的其他人,他们以VG字符作为其徽标。:O
kirbyfan64sos

我们可以看到该示例的解决方案吗?更多示例也将有所帮助。
卡德2015年

辉煌:)。以后您可能还会遇到生成器挑战
Beta Decay's

3
输入法可以简化吗?也许使用2D整数数组,并且-1是墙,还是0空白?这样就可以更轻松地专注于难题的真正挑战,然后就不存在用零填充数字或解析字符串的复杂性。
mbomb007'1

Answers:


1

JavaScript(Node.js),482字节

这是一个蛮力解决方案,它始于01并检查每个相邻的单元格,以检查是否有空单元格(--)或所需的数量,并遵循完成或不可能的路径。如果所需的号码存在并且不是邻居,它将简化此解决方案。最大的网格需要几秒钟。

这可能不是特别有趣,但是我认为在查看Rosetta Code上链接的答案之前,我会尝试解决问题的方法,并且我乐于应对稍微困难一点的挑战!

找到许多存在的所有解决方案。主体是一个接受二维数组的函数,页脚将输入处理为所需格式,并将结果也返回为所需格式。乐于提供更多信息(如果有兴趣,还可以减少实施)。

f=a=>{F=(D,n,j)=>[Z=[].concat(...D),z=Z.indexOf(j),z>-1&&[x=z%w,y=z/w|0],z>-1&&[[x-1,y-1],[x,y-1],[x+1,y-1],[x-1,y],[x+1,y],[x-1,y+1],[x,y+1],[x+1,y+1]]][n];C=q=>q.map(Q=>Q.slice());w=a[0][L='length'];l=F(a,0).filter(c=>c!='XX')[L];R=[];r=(s,d)=>{let n=`0${+s+1}`.slice(-2);N=F(d,2,n);n>l?R.push(C(d)):~F(d,1,s)?(p=F(d,3,s),p.filter(P=>P==N+'')[L]?r(n,C(d)):!~F(d,1,n)?p.map(I=>{[x,y]=I,(x<0||x>w-1||y<0||y>d[L]-1)||d[y][x]=='--'&&(D=C(d),r(D[y][x]=n,D))}):0):0};r('01',a);return R}

在线尝试!

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.