计算机等级考试C语言程序设计例解(07)

文章作者 100test 发表时间 2007:03:10 17:19:25
来源 100Test.Com百考试题网


07. 有2*n个盒子排成一行,其中有两个相邻的空盒,有n-1个盒子有符号A,有n-1个盒子有符号B。例如,n=5,并有初始配置如下:
A B B A . . A B A B


试编制程序,将输入的盒子排列状态按以下交换规则将全部‘A’放到全部‘B’的左边,不管相邻两空盒的位置。交换规则是任意两个非空相邻盒子的内容可移入两个空盒中,但移动时不得变更两符号的前后次序。编写程序输入初始配置后,找出达到目标要求的最少交换次数的方案。
解:
从一种盒子排列出发,将其中两个非空相邻盒子中的内容移入空盒的每一种移动,会使盒子产生新的排列状态,采用试探法穷举所有可能的移动找问题的解。首先将盒子初始排列存入移动步聚表,然后是试探和回溯循环。循环工作内容有:检查当前排列,若当前排列是要求的最终状态,则将达到该状态的移动步聚保存,并回溯去找更少移动步数的解。在试探超 过限定的深度或当前状态的所有可能移动都已试探穷尽情况下回溯;否则对当前状态取其当前移动方法产生新的后继状态存入移动步聚表,并继续向前试探。为能从某种排列出发,通过移动产生更接近目标要求的排列,对移动方法的选取作如下规定:
。掠过无意义的来回移动;
。不把两个相邻的同为符号‘A’的盒子向后移;
。不把两个相邻的同为符号‘B’的盒子向前移;
。不把两个盒子移入到这样的位置,移入后其首尾没有一个与相邻的盒子相同。
试探回溯找解算法如下:
算法---试探回溯找解
{
输入初始排列;
初始状态存入移动步聚表;
设置其它初值;
d=0. /*当前试探深,或当前状态位置*/
do
{
if(当前状态为盒子排列的终态)
{
保存解;
记录当前解的试探深度;
回溯;
if(取尽所有可能的解)break.
}
if(试探深度超过设定值,或取尽当前状态的所有选择)
{
回溯;
if(取尽所有可能的选择)break.
}
else
{
求新状态的空盒位置;
取当前状态的移动方法和当前状态;
设定当前状态的下一个移动方法;
掠过各种不希望的方法;
生成新状态;
试探深度增1;
}
}while(1).
if(找到解)
输出解;
}


相关文章


计算机二级考试备考秘诀
天津:2005年下半年计算机等级考试6月1日起报名
湖北:2005年英语和计算机全国等级考试时间敲定
计算机等级考试C语言程序设计例解(07)
关于计算机二级考试
江苏:2005年上半年计算机等级考试分数成绩查询
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛