21分(3+4+3+3+4+4)
积木游戏:设有n 个小木块排成一排,如下图:
……
游戏开始时,每个小木块向下的一面涂有红、黄、蓝三种颜色之中的一种(约定:0表示红色,1表示黄色,2表示兰色)。要求通过翻看与交换方式对小木块重新排列(翻看的规则为每个小木快只能看一次),最终成为下面的形状:
…… …… ……
红 蓝 黄
即相同颜色的木块排列在一起,设计一个翻看与交换的方案,使得用最少的交换次数实现上面的要求。
[算法描述] 翻看小木块时,可以从两端进行。
例如,设中间状态如下:
…… A …… B …… C ……
红 未翻过 蓝 黄
此时,可以从两个方向看,即从A或B处开始:
(1)若看A则有三种可能性:
为红色,则不用交换
为兰色,交换一次,即A与B交换
为黄色,交换两次,即C与B交换一次,然后A与C再交换一次
此时,平均交换次数为1。
(2)若看B,也有三种可能性:
为兰色,则不用交换
为红色,交换一次,即B与A交换。
为黄色,交换一次,即B与C交换。
此时,平均交换次数为2/3。
由此可见,从B处翻看直到游戏结束,次数最少符合题目要求。
[程 序]
CONST N=20;
VAR I,TEM,R,B,Y:INTEGER;
A:ARRAY[1..N] OF 0..2;
BEGIN
FOR I:=1 TO N DO READ(A[I]);
R:=1; B:=N ; Y:=N;
WHILE R<=B DO
IF A[B]=0 THEN BEGIN
TEM:=A[R];A[R]:=A[B];A[B]:=TEM;
R:=R+1
END
ELSE IF A[B]=1 THEN BEGIN
TEM:=A[B];A[B]:=A[Y];A[Y]:=TEM;
Y:=Y-1 ; B:=B-1 ;
END
ELSE B:=B=1
FOR I:=1 TO N DO WRITE(A[I]:3)
END.