2012-03-31 52 views
1

首先我没有这个谜语的真名,它简直就是“ABC”。序言中的谜语

在开始时他们给我的大小板(nxm)和n,m =(1,10)和一个字母,例如C,所以我可以在ma解决方案中只用字母A到C.
然后我得到一些形式为(i,j,k)的三分,我< = n,j < = m和k属于(A,C)。

例如板它一开始是这样的:
Example board

对每一个空盒子,我必须以这样的方式键入字母A,B,C,当我打完字,它们必须满足以下条件:

  • 如果在一个行(列)是不同的字母,每个字母的此行中出现(列)相同的次数
  • 至少一行(列)中的所有字母都一样。

你有任何想法如何解决这类谜语?
也许这个难题有它自己的名字,我可以在某处读到它吗?

编辑: 我必须从文件中读取的所有数据。此文件如下所示:

4. 4. 'C'。 (3,1,'B'),(4,1,'A'),(1,2,'B'),(4,2,'C'),(1,3' ),(2,4,'A')]。

小正确:在只有一行或一列所有字母都是一样的,不同时。 解决方案我的例子是:

B A B A 
B C B C 
C C C C 
C A C A 
+1

家庭作业,对吧? – 2012-03-31 11:12:15

+0

当然可以。这是一种作业:) – mastah 2012-03-31 11:13:09

+3

请张贴董事会的代表和任何想法,你可以拿出。 – 2012-03-31 11:28:23

回答

0

您所描述的问题可以被看作是一种限制问题上的字母有限域。你的变量表示棋盘上的位置,所以你将有n * m个这样的值。每个变量的范围在可能值的有限范围内,由用户提供的字母表示。最后,用户输入的三元组和解决方案要满足的条件是约束条件。

要实现了有限域不同的工具和库约束编程都可以使用,例如,SWI-Prolog有clpfd库。

+0

我想我不能使用任何库... – mastah 2012-03-31 21:18:00

1

我想@KarolyHorvath想给大家分享的是如何与你试图解决这个为自己的任何想法在Prolog中表示板,在一起。在下面我将使用列表表示的列表,内部列表是行和它们的项目符号或原子(单个小写字母,以保持简单)。

的问题在某种意义上拉丁方,这需要准确的每个符号之一,在每一行和每一列的推广。用一个只包含一些新符号的新行和列来拉丁广场,拉丁广场中没有显示,并且您将有满足您问题要求的解决方案。

也就是说,你的问题涉及到一个部分完成的矩形板,不一定是方形的,并且符号频率可以在行到列和列到列之间变化。

对于像Example Board这样的小型电路板,3x3阵列,蛮力方法是诱人的。但是有一些简单的事情可以编码,以保持搜索效率。

某些行和某些列必须是“常量”,即它们只能包含一个字母。我想我会把它作为搜索树的最高选择,即选择一个可以是单个字母的行和列。请注意,由于每一行都与每一列相交,因此我们将对该行和列使用相同的字母。

但在开始搜索解决方案之前,您需要输入表示包含“给定”条目的电路板的数据。使用你自己对此的判断,但是对于合理大小的板子,你可能会要求用户输入行数和列数,然后逐行提示它们。

请记住,Prolog术语读者希望输入被句点终止。所以输入可能工作是这样的:

Enter a list of all letters: [a,b,c]. 
How many rows? 4. 
How many cols? 4. 
Enter a row as a list: [_,_,b,a]. 
Enter a row as a list: [b,_,_,c]. 
Enter a row as a list: [c,_,_,_]. 
Enter a row as a list: [_,a,_,_]. 

下划线作为输入匿名变量和叶代表董事会作为自由变量列表中的条目对应的列表。

可以因此与代表你的程序中的所有字母的列表:

Symbols = [a,b,c] 

,并用列表的列表中的板可能看起来像:

Board = [[A1,A2,b,a],[b,B2,B3,c],[c,C2,C3,C4],[D1,a,D3,D4]] 

在具体的例子有只是将所有行和列设置为相同字母的一种可能方式,并且通过使第二列和最后一行都具有所有a:

Board = [[A1,a,b,a],[b,a,B3,c],[c,a,C3,C4],[a,a,a,a]] 

但是现在我们发现寻找解决方案的方法会陷入盲目。第二行有三个字母,但是在四行中,三个字母不可能出现相同的次数。这个例子没有解决方案。

然而,“无解”结果非常有效。

希望这给你一些关于如何在Prolog中编写一般求解过程的想法。