设为首页 加入收藏

TOP

C数字移动
2014-11-11 17:45:09 来源: 作者: 【 】 浏览:35
Tags:数字 移动

  当前位置:首页>挖经验>题库中心>C/C++语言程序百例>100.数字移动


  100.数字移动作者:不详 来源:互联网  酷勤网收集 2008-04-25


  摘要


  酷勤网  在图中的九个点上,空出中间的点,其余的点上任意填入数字1到8;1的位置固定不动,然后移动其余的数字,使1到8顺时针从小到大排列.移动的规律是:只能将数字沿线移向空白的点.请编程显示数字移动过程。思考题:编写更优化的程序,尽可能减少移动的步数。


  在图中的九个点上,空出中间的点,其余的点上任意填入数字1到8;1的位置固定不动,然后移动其余的数字,使1到8顺时针从小到大排列.移动的规律是:只能将数字沿线移向空白的点.


  请编程显示数字移动过程。


  *问题分析与算法设计


  分析题目中的条件,要求利用中间的空白格将数字顺时针方向排列,且排列过程中只能借空白的点来移动数字.问题的实质就是将矩阵外面的8个格看成一个环,8个数字在环内进行排序,同于受题目要求的限制"只能将数字沿线移向空白的点",所以要利用中间的空格进行排序,这样要求的排序算法与众不同.


  观察中间的点,它是唯一一个与其它8个点有连线的点,即它是中心点.中心点的活动的空间最大,它可以向8个方向移动,充分利用中心点这个特性是算法设计成功与否的关键.


  在找到1所在的位置后,其余各个数字的正确位置就是固定的.我们可以按照下列算法从数字2开始,一个一个地来调整各个数字的位置.


  *确定数字i应处的位置;


  *从数字i应处的位置开始,向后查找数字i现在的位置;


  *若数字i现在位置不正确,则将数字i从现在的位置(沿连线)移向中间的空格,而将原有位置空出;依次将现有空格前的所有元素向后移动;直到将i应处的位置空出,把它移入再次空出中间的格.


  从数字2开始使用以上过程,就可以完成全部数字的移动排序.


  编程时要将矩阵的外边八个格看成一个环,且环的首元素是不定的,如果算法设计得不好,程序中就要花很多精力来处理环中元素的前后顺序问题.将题目中的3X3矩阵用一个一维数组表示,中间的元素(第四号)刚好为空格,设计另一个指针数组,专门记录指针外八个格构成环时的连接关系.指针数组的每个元素依次记录环中数字在原来数组中对应的元素下标.这样通过指针数组将原来矩阵中复杂的环型关系表示成了简单的线性关系,从而大大地简化了程序设计.


  *程序说明与注释


  #include


  int a[]={0,1,2,5,8,7,6,3}; /*指针数组.依次存入矩阵中构成环的元素下标*/


  int b[9]; /*表示3X3矩阵,b[4]为空格*/


  int c[9]; /*确定1所在的位置后,对环进行调整的指针数组*/


  int count=0; /*数字移动步数计数器*/


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C数制转换 下一篇C选美比赛

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: