2016-12-05 23 views
0

基本上我試圖序言,可以解決一場名爲陰陽,Independente酒店董事會的規模,以實現節目的列表。遊戲基本上是爲了繪製特定顏色(黑色或白色)的棋盤的每個單元,並且所有相同顏色的單元彼此垂直或水平連接。我用一個列表來表示這個。示例初始 - >解決方案:https://i.gyazo.com/24a70d868934dfbf1540343e89d14c4b.png序言 - 檢查2x2的細胞中列出

但是有一條規則我遇到了問題:「沒有2X2組單元格可以包含單色圓圈。

任何想法我可以保證這不會發生使用clpfd庫嗎?

列表代表董事會例如:

[[0,0,0,0,0,0], 
[0,0,0,1,0,0], 
[0,0,1,1,2,0], 
[0,2,0,0,2,2], 
[1,0,2,0,1,0], 
[0,1,0,0,0,1]] 
+0

你有任何代碼寫的? –

+0

@aimee是的,但不是在這個規則中具體。其他棋盤限制 –

回答

0

我解決了這個問題:這是我用來解決上述問題的代碼。

twoByTwo([_],[_]). 
twoByTwo([F1,S1|T1],[F2,S2|T2]):- 
    F1 + S1 + F2 + S2 #> 4, 
    F1 + S1 + F2 + S2 #< 8, 
    twoByTwo([S1|T1],[S2|T2]). 

基本上,twoByTwo會在每個參數上接收一個線路板(按順序)。

所以基本上這個功能被稱爲遞歸:twoByTwo(1號線,2號線),twoByTwo(2號線,3號線)等

0

我設法做的問題的變體:

get-elem(B, R, C, E) :- get-line(B, R, Row), get-line(Row, C, E). 

get-line([R|_], 0, R). 
get-line([_|A], N, R) :- get-line(A, M, R), N is M + 1. 

twoXTwo(B, R, C) :- \+ (R1 is R+ 1, C1 is C+1, 
         get-elem(B, R, C, E1), 
         get-elem(B, R1, C, E2), E1 = E2, 
         get-elem(B, R, C1, E3), E2 = E3, 
         get-elem(B, R1, C1, E4), E3 = E4). 

,我檢查在位置[(r+1,c), (r,c+1), (r+1,c+1)]元素是不一樣的元素。我也不確定數字的含義是黑色(1)還是白色(0)。

+1

首先是'/ -/_ /' – false

+0

0代表空單元格,1代表白色棋子,2代表黑色棋子。 最後應該沒有0,那些只是原始輸入(根據遊戲規則完成半填充棋盤) –