当前位置: 首页 > 知识库问答 >
问题:

Prolog中的矩形挂钩接龙?

汝臻
2023-03-14

因为我是Prolog的新手,所以这里可能会有一个简短的问题。我试图将这个解决三角形挂钩接龙难题的代码转换为解决矩形挂钩接龙难题。我想我面临的问题是试图弄清楚如何让程序知道它完成了难题。这是我目前得到的:

% Legal jumps along a line.
linjmp([x, x, o | T], [o, o, x | T]).
linjmp([o, x, x | T], [x, o, o | T]).
linjmp([H|T1], [H|T2]) :- linjmp(T1,T2).

% Rotate the board
rotate([[A, B, C, D, E, F],
        [G, H, I, J, K, L],
        [M, N, O, P, Q, R],
        [S, T, U, V, W, X]],
        [[S, M, G, A],
        [T, N, H, B],
        [U, O, I, C],
        [V, P, J, D],
        [W, Q, K, E],
        [X, R, L, F]]).

rotateBack([[A, B, C, D],
            [E, F, G, H],
            [I, J, K, L],
            [M, N, O, P],
            [Q, R, S, T],
            [U, V, W, X]],
            [[D, H, L, P, T, X],
            [C, G, K, O, S, W],
            [B, F, J, N, R, V],
            [A, E, I, M, Q, U]]).

% A jump on some line.
horizjmp([A|T],[B|T]) :- linjmp(A,B).
horizjmp([H|T1],[H|T2]) :- horizjmp(T1,T2).

% One legal jump.
jump(B,A) :- horizjmp(B,A).
jump(B,A) :- rotate(B,BR), horizjmp(BR,BRJ), rotateBack(A,BRJ).
%jump(B,A) :- rotate(BR,B), horizjmp(BR,BRJ), rotate(BRJ,A).

% Series of legal boards.
series(From, To, [From, To]) :- jump(From, To).
series(From, To, [From, By | Rest])
       :- jump(From, By),
         series(By, To, [By | Rest]).

% A solution.
solution(L) :- series([[o, x, x, x, x, x],
                       [x, x, x, x, x, x],
                       [x, x, x, x, x, x],
                       [x, x, x, x, x, x]], L).

三角拼图代码要求用户输入结束表的样子,但我不想这样。我希望这能显示任何可能的解决方案。表格总是正好6x4。我喜欢旋转网格来继续简单地计算水平跳跃的想法,所以我改变了旋转功能来旋转它的侧面,并添加了旋转功能来把它放回原位。我想我必须这样做,因为网格不对称。因为它总是这个大小,我认为找到终点的最简单方法是设置一个计数器来计算发生了多少次移动。一旦我们达到22步(除了1个挂钩之外,最大移动可能清除整个网格),那么解决方案就会成功。

换句话说,我认为我需要删除以下代码:

% Series of legal boards.
series(From, To, [From, To]) :- jump(From, To).
series(From, To, [From, By | Rest])
       :- jump(From, By),
         series(By, To, [By | Rest]).

然后改变它,这样它就会设置一个计数器,停在22。有什么建议吗?

共有1个答案

郑锋
2023-03-14

我想你可以数一数这些钉子,如果至少有两个钉子的话,那就更好了。

为了有效地执行,应该是(未经测试的代码)

finished(L) :-
   \+ call_nth(find_peg(L), 2).
find_peg(L) :-
   member(R, L),
   memberchk(R, x).

本答案中定义的call_nth/2需要内置nb_setval。这在SWI Prolog或Yap中提供。

 类似资料:
  • 我试图在<code>serenity bdd<code>项目中实现全局钩子。当我浏览下面的链接时,发现其中没有一个对我有用。其中一些并不是Serenity BDD特有的。 解决方案1 解决方案2 我的Maven版本是:

  • 我有两个矩形,其中一个是另一个的剪裁。现在我想围绕剪切矩形的中心旋转较大的矩形并调整x / y值。 如何计算旋转后的新x/y值? 我只想绕着小盒子的中心旋转大盒子的x/y。因此,较大盒子的x/y点相对于较小盒子的顶部/左侧点。我有小盒子的宽度和高度,所以我可以计算大盒子相对于小盒子中心的x/y点。旋转的角度以度为单位。旋转可以是任何角度,例如10度。

  • 如何在hook前读cucumber中例子的标签名? @feature_tag功能:功能描述 @outline_tag场景大纲:给定场景细节的大纲描述 我想在输出中打印“@example_tag”。 使用java代码作为 但是得到错误作为 "在钩子之前失败:step definitions . before scenario(scenario outline)消息:cucumber . runtim

  • 问题内容: 我在程序中添加了以下代码: 但是,我没有看到该消息。附加信息:我正在Java 7的Netbeans IDE内部运行该程序。 编辑:我忘了补充说,有一个使程序保持活动状态的全局线程。我通过按Netbeans右下角的[x]来关闭它。 问题答案: JVM可以有序或突然关闭。关闭挂钩会运行以有序关闭:当最后一个线程终止时,有人呼叫或通过其他平台特定的方式(例如,按Ctrl-C)。 Shutdo

  • 我正在努力学习pyGame。我遇到了一个问题。我有一个矩形,可以用箭头按钮移动。然后我创建了另一个线程,它生成可以拾取的较小矩形。但是当我运行我的游戏时,生成的小矩形闪烁太多。我怎样才能让他们稳定?我想我不太明白这里的时间概念。有人能给我解释一下吗 我的代码:

  • 我对编码还是很陌生,所以我只是在尝试制作一些简单的游戏,比如Snake。现在,我正试图让苹果被吃掉时的轨迹沿着头部,但我遇到了一个问题。 我现在有它,这样尾巴在正确的时间在正确的地方产卵,但它们不会移动。它们产卵并静止。我的尾部片段存储在ArrayList中,我不知道如何在每个滴答声中更新矩形的坐标值。如何更改每个矩形的坐标值? 这就是我目前所拥有的。这是我的蛇类的一部分,它会产生尾巴并绘制它们