【发布时间】:2015-06-25 13:43:55
【问题描述】:
我正在尝试编写一个程序来确定如果棋盘上有 2 个皇后,8x8 棋盘的哪些位置可以安全地放置一个马。
函数的输入是[0, 0, 6, 0, 0, 4, 0, 0],所以它被称为knightPlace [0, 0, 6, 0, 0, 4, 0, 0]。所有非零都是皇后。
如您所见,列表的第 3 和第 6 个元素是 6 和 4,这导致皇后位于第 3 列和第 6 行和第 6 列和第 4 行(假设您从底部的 0,0 开始棋盘的左角)。
我的 col 和 row 检查过滤得很好,但我的 diagCheck 带来了一个新的错误消息:
knightPlace[0, 0, 6, 0, 0, 4, 0, 0]
*** Exception: divide by zero
有人可以帮帮我吗?它永远不应为 0,因为 diagCheck 解决了皇后和另一个坐标的斜率,使其为假,因此如果斜率为 == 1 或 -1 则不添加
这是我使用的代码:
knightPlace n = makeboard n
where
makeboard n = [(i + 1,j + 1) | i<-[0..(length n -1 )], j<-[0..(length n - 1)], colrowcheck n i j]
-- col and row check, if the condition ==FALSE it doesnt get added
colrowcheck n i j = and [(n!!(i) == 0) && n!!(k) /=(j+1)| k<-[0..(length n -1 )], not(diagcheck n i j k) ]
-- diagcheck
diagcheck n i j k = ((j+1) - n!!(k)) `div` ((i+ 1) - k) == -1 || ((j+1) - n!!(k)) `div` ((i+1) - k) == 1
【问题讨论】:
-
要将
div用作中缀函数,您必须将其括在反引号中:(j - n!!(k)) `div` (i - k) -
哇,好吧,我解决了这个问题,但现在它说我除以零,我会相应地改变问题
-
你应该提出一个新问题而不是改变这个问题,这样你就不会使答案无效。