旅馆房间门的着色
有一由8个房间组成的圆形旅馆,没有房间号码。经理别出心裁,想将门分别着上蓝色或者黄色之一,将这8个房间分开来,问怎样对门进行着色可以达到要求?
考虑8个门的一种着色分案a[0] a[1] …a[7],若门着黄色,则相应的a[i]=0,着兰色,则a[i]=1。显然只根据一个门的频色是无法将它同其它房间区分开来的,根据两个门的颜色也不可能区分开八个房间,因为两种颜色的2组合仅有4种可能性,这相当于两位二进制数只有4种一样。
由于3位二进制数共有8个,若我们对房间门的着色进行合理安排,使得连续三个门的着色没有相同的情况,这样就可能完成题目的要求。那么,这样的安排是否存在呢?下面我们设计程序来寻找我相应的着色方案。
由于总有连续的三个门颜色均为黄色,我们不妨从这里开始考虑后面5个门的着色情况,对每个门的着色是一个试探的过程,对第i(2<i<7)个门的着色是可行的,当且仅当a[i-2]a[i-1]a[i] 不出现在序列a[0]a[1]...a[i-1]中,当i=7时,除要求a[5]a[6]a[7]不出现在a[0]a[1]...a[6]中外,还必须要求a[6]a[7]a[0]不在a[0]a[1]...a[6]a[7]中,且a[7]a[0]a[1]不在 a[0]a[1]...a[6]a[7]a[0]中。
事实上,上面的条件表示对于任给的不同i,j,a[i]a[i+1]a[i+2] ≠a[j]a[j+1]a[j+2],这里0≤i<j≤7,且a[8]=a[0],a[9]=a[2]。
在试探的过程中,也许会发现某个房间门的颜色无论怎样安排均不能满足问题的要求,例如对于部分解序列000100,第6个门不管是着黄色(0),还是着兰色(1)都不允许,其原因在于前面门着色不当,因此,遇到这种情况就必须进行回溯。
可以采用回溯法来编制一个问题求解程序。
~~~~~~~~~~~~~~
如果用图的术语来描述上述问题,相当于求有向图G上的一条Hamilton有向回路,其中G的顶点集为V={xyz|x,y,z=0或1},G的边集为E={<xyz,yzw>|xyz,yzw∈V}。画出一个8点的图,容易找出其中的一条Hamilton有向回路,例如00011101,一般地,若Hamilton回路标记为a[0]a[1]a[2],a[1]a[2]a[3],...,a[n-1]a[0]a[1],则着色方案为a[0]a[1]...a[n-1] 。
~~~~~~~~~~~~~~
问题也可以按另一种思路用图的术语加以描述。定义图G=<V,E>为:
V={xy|x,y=0或1}
E={<xy,yz>|xy,yz∈V}
并对每一条边<xy,yz>标记上01串xyz。显然图G中每一顶点的出度和入度均为2,因此图G上存在有向Euler回路,即经过每条边一次且仅一次的回路,在该回路中,相邻的两条边xyz,uvw有y=u,z=v成立,因为它们同时与一个顶点相关,从而该回路可以表示为a[0]a[1]a[2],a[1]a[2]a[3],...,a[n-1]a[0]a[1],这里n=8,它对应旅馆门的着色序列a[0]a[1]...a[n-1]。
对于上面的图,一条Euler回路为000,001,010,101,011,111,110,100从而,对应的着色方案为:00010111。
应用这一模型,对于旅馆房间数为2^n的着色问题都可以容易地解决,以下是n=4时的一种方案:0000,0001,0011,0111,1111,1110,1100,1001,0010,0101,1011,0110,1101,1010,0100,1000,对应的着色方案为:0000111100101101。
~~~~~~~~~~~~~~~~
当房间数k不是2^n时,对于求Hamilton回路的模型,问题变成求长度为k的有向回路,且每一顶点只能访问一次,而对于求Euler回路的模型,则要求求长为k的有向回路。无论k是什么数,Euler回路模型的求解总比Hamilton回路模型要简单得多。