Concurso/Encontro Nacional de Programação Lógica CeNPL'02

Universidade de Coimbra / Instituto Politécnico de Coimbra

11--13 de Abril de 2002


Problema no 2

Palavras Cruzadas

Introdução

Todos sabem, de certeza, o que é um jogo de palavras cruzadas. Nem vale a pena estar com grandes explicações. Aqui vamos jogar um jogo, também solitário, parecido com o das palavras cruzadas. Tal como nas palavras cruzadas clássicas, há um quadro que inicialmente tem uma série de quadrados em branco e outros preenchidos a negro. Só que, ao contrário do jogo clássico, aqui sabemos à partida quais as palavras que temos de colocar no quadro (nas palavras cruzadas só temos dicas sobre que palavras poderão ser). Não sabemos é em que posição colocar essas palavras (no jogo clássico, neste aspecto a coisa é mais facilitada, pois sabe-se sempre em que linha ou coluna deve ser colocada cada palavra). O objectivo do jogo é colocar no quadro todas as palavras dadas inicialmente , seguindo as regras usuais das palavras cruzadas (um caracter apenas por quadrado; não podem haver duas palavras consecutivas, na mesma linha ou coluna, sem que pelo meio haja pelo menos um quadrado a preto, etc).

Por exemplo, se forem dadas as palavras CENPL, PROLOG, UPA, PAI, POOP, GATO, CAO, PATITO, ANIZ, PIGET, ZIG, TPTI e o quadro da figura 1, uma solução possivel é a que se apresenta na figura 2.

                             
           
           
           
           
           
U   P O O P
P A I            R 
A      G A T O
     C E N P L
P A T I T O
  O      Z I G
Figura 1 Figura 2

O que se pretende é que faça um programa Prolog que, dados um quadro não preenchido de palavras cruzadas e uma lista de palavras a colocar, preencha o quadro com essas palavras.

Os Dados

O programa deverá ser chamado através do predicado cruzadas/0 e afixar os resultados no terminal conforme explicado abaixo.

A descrição do quadro inicial e da lista de palavras a colocar é feita, respectivamente, através dos factos quadro/1 e palavras/1, que serão adicionados ao seu programa.

O argumento do facto palavras/1 será uma lista de palavras, sendo que cada palavra (para lhe simplificar a tarefa) é dada como uma lista de caracteres. Por exemplo, se se pretender colocar a lista de palavras do exemplo acima, adiciona-se o facto:
palavras([[c,e,n,p,l],[p,r,o,l,o,g],[u,p,a],[p,a,i],[p,o,o,p],[g,a,t,o],
          [c,a,o],[p,a,t,i,t,o],[a,n,i,z],[p,i,g,e,t],[z,i,g],[t,p,t,i]]).
O argumento do facto quadro/1 é uma matriz, representada como uma lista de listas (onde cada lista elemento corresponde a uma linha). Nessa matriz as posições correspondentes a quadrados em branco têm variáveis livres, e as correspondentes a quadrados a preto têm o símbolo `+'. Por exemplo, o quadro da figura 1 é representado por:
quadro([[_,+,_,_,_,_],
        [_,_,_,+,+,_],
        [_,+,_,_,_,_],
        [+,_,_,_,_,_],
        [_,_,_,_,_,_],
        [+,_,+,_,_,_]]).

Os Resultados

Caso não seja possivel colocar todas as palavras no quadro, o predicado cruzadas/0 deve falhar. Se for possivel, deve escrever no ecrã o quadro preenchido com as palavras (uma linha do ecrã por linha do quadro; os quadrados preenchidos a preto devem ter o símbolo `+'; se houverem casas por preencher após a colocação de todas as palavras, no seu lugar deverá estar o símbolo `_').

Por exemplo, se chamado com os dois factos acima, o resultado deverá ser o que se apresenta à esquerda. Se, para o mesmo quadro, a lista de palavras for a acima, mas sem as duas últimas palavras (tpti e zig) o resultado será o que apresenta à direita (note o `_' na penúltima posição da última linha):
 | ?- cruzadas.             | ?- cruzadas.

 u+poop                     u+poop
 pai++r                     pai++r
 a+gato                     a+gato
 +cenpl                     +cenpl
 patito                     patito
 +o+zig                     +o+z_g

This document was translated from LATEX by HEVEA.