2015-12-12 2 views
2

Я работаю над решателем головоломки (нонограммы, гридлер, пикросс ...) только для удовольствия и для изучения немного больше ASP. (Вы можете узнать больше об этих головоломках в википедии https://en.wikipedia.org/wiki/Nonogram)Сопряженная группа ячеек в сетке

Я хочу, чтобы проверить, есть ли горизонтальная смежный группа черных цветных клеток (cell(I,J,o)) окружены два белых клетками (cell(I,J,x)), один слева и один к право группы.

#const rows = 3. 
#const cols = 3. 

symbol(x;o). 

row(0..rows+1). 
col(0..cols+1). 

% Padding surrounding the puzzle so we can check every group's surroundings 
cell(I,0,x) :- row(I). 
cell(I,cols+1,x) :- row(I). 
cell(0,J,x) :- col(J). 
cell(cols+1,J,x) :- col(J). 

% Assign symbols to every cell available 
1 { cell(I, J, S) : symbol(S) } 1 :- row(I), col(J). 

% Horizontal block (row,starting col,length) 
hblock(I,J1,L) :- row(I), col(J1), col(J2), J1 <= J2, L = J2-J1+1, 
        col(J1-1), col(J2+1), cell(I,J1..J2,o), 
        cell(I,J1-1,x), cell(I,J2+1,x). 

% Output only cells that are not padding 
out_cell(I,J,S) :- cell(I,J,S), I > 0, J > 0, I <= rows, J <= cols. 

#hide. 
#show hblock/3. 
#show out_cell/3. 

Как вы можете видеть, я использую cell(I,J1..J2,o) в hblock/3 определение, чтобы проверить, что каждая клетка между col(J1) и col(J2) черный (отмечен символом о), но, когда дается следующий вход:

cell(1,1,x). cell(1,2,x). cell(1,3,x). 
cell(2,1,o). cell(2,2,x). cell(2,3,o). 
cell(3,1,x). cell(3,2,x). cell(3,3,x). 

Он выводит hblock(2,3,1) hblock(2,1,3) hblock(2,1,1), что означает, что он обнаруживает два блока одной черной ячейки (In (2,1) и (2,3)) и большой блок из трех черных ячеек между (2,1) и (2 , 3), но он не должен быть обнаружен, поскольку он имеет ячейку, помеченную х в середине ...

Что я делаю неправильно?

+0

Думаю, я нашел решение. По какой-то причине ячейка (I, J1..J2, o) не проверяет все ячейки между ними. На данный момент L {cell (I, J1 .. J2, o} L работает правильно – Trigork

ответ

1

Если я правильно помню, cell(I,J1..J2,o) будет генерировать отдельные правила для каждого номера между J1 и J2. Он не расширяет их в той же строке, то есть в одном правиле. Так

hblock(I,J1,L) :- row(I), col(J1), col(J2), J1 <= J2, L = J2-J1+1, 
       col(J1-1), col(J2+1), cell(I,J1..J2,o), 
       cell(I,J1-1,x), cell(I,J2+1,x). 

расширяется

... 
hblock(1,1,1) :- cell(1,1,o). 
hblock(1,2,1) :- cell(1,2,o). 
hblock(1,3,1) :- cell(1,3,o). 
hblock(1,1,2) :- cell(1,1,o). 
hblock(1,1,2) :- cell(1,2,o). 
hblock(1,2,2) :- cell(1,2,o). 
hblock(1,2,2) :- cell(1,3,o). 
hblock(1,1,3) :- cell(1,1,o). 
hblock(1,1,3) :- cell(1,2,o). 
hblock(1,1,3) :- cell(1,3,o). 
... 

я не получил, насколько выяснить, почему hblock(2,1,2) и hblock(2,2,2) не хватает, но это, вероятно, не очень актуальна.

+0

Это похоже на то, спасибо за разъяснение. Если вы прочтете мой комментарий, вы увидите, что его можно зафиксировать с ограничением мощности. – Trigork

Смежные вопросы