arrays - 序幕,骑士攻击

标签 arrays prolog combinatorics

我有一个一维数组,这意味着国际象棋 table 。我想找到骑士可以攻击的所有位置。
例如,有一个 3x3 的棋盘(K 是骑士,X 是攻击位置):

---------------
| X |    |    |
---------------
|    |    | K |
---------------
| X |    |    |
---------------

对于这个表,在序言程序中,我想要数组:
-------------------------------------
| X |   |   |   |   | K | X |   |   |
-------------------------------------

我想为所有情况编写通用程序 - 3x3 表、4x4、5x5 等。

我试过:
control(Table, N, Pos, NewTable) :- insert(Table, Pos, 'k' , TempTable1, 1),
                     insert(TempTable1, Pos-N*2+1, 'x' , TempTable2, 1),
                     insert(TempTable2, Pos-N*2-1, 'x' , TempTable3, 1),
                     insert(TempTable3, Pos-N  +2, 'x' , TempTable4, 1),
                     insert(TempTable4, Pos-N  -2, 'x' , TempTable5, 1),
                     insert(TempTable5, Pos+N*2+1, 'x' , TempTable6, 1),
                     insert(TempTable6, Pos+N*2-1, 'x' , TempTable7, 1),
                     insert(TempTable7, Pos+N  +2, 'x' , TempTable8, 1),
                     insert(TempTable8, Pos+N  -2, 'x' , NewTable,   1).

有 N - 是 table 大小(3),Pos - 骑士位置。
“插入”没问题,但“控制”不能正常工作:
?- control([0,0,0,0,0,0,0,0,0], 3, 6, R).
R = [x, 0, 0, 0, x, k, x, 0, 0].

应该是 R = [x, 0, 0, 0, 0, k, x, 0, 0] .

任何想法,如何改变“控制”谓词?

最佳答案

移除插入物直到流氓 x 消失。这应该告诉你问题出在哪里。

编辑:啊哈!我以前应该想到的。当骑士通过棋盘的左侧或右侧边缘时,您不会剪裁他们的移动,因此骑士向上移动到最高等级,然后向右移动两个,然后环绕到中间等级并将骑士紧挨着它起始位置。 insert只能裁剪顶部和底部,因为它只能看到一个数组;它不知道板子有多宽。

关于arrays - 序幕,骑士攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4356109/

相关文章:

c - 将 uint16_t 数组传递给采用 uint8_t* 的函数

performance - Prolog 的 CLP over Finite Domains 库性能

algorithm - Matlab:找到产生另一个矩阵的置换矩阵

C结构共享公共(public)指针?

Javascript:根据两个标准拆分字符串?

prolog - 是否可以在产生式规则中引用事实?

prolog - 序言中的递归乘法

java - 总和为 A 的 N 个整数的不同组数

kotlin - 什么功能方法可以帮助我实现速度返回算法?

javascript - 如何将 Node JS 请求的结果主体显示到浏览器?