在九宫格的九个点上,空出中间的点,其余的点上任意填入数字1至8;1的位置固定不动,然后移动其余的数字,使1到8顺时针从小到大排列。移动的规则是:只能将数字沿线移向空白的点。
请编程显示数字移动过程。
1.问题分析与算法设计
分析题目中的条件,要求利用中间的空白格将数字顺时针方向排列,且排列过程中只能借助空白的点来移动数字。问题的实质就是将矩阵外面的8个格看成一个环,8个数字在环内进行排序。由于受题目要求的规则“只能讲数字沿线移动向空白的点”,所以要利用中间的空格进行排序,这样要求的排序算法与众不同。
中间的点是唯一一个与其他八个点有连线的点,即它是中心点。中心点的活动的空间最大,它可以向8个方向移动,充分利用中心点这一特性是算法设计成功与否的关键。
在找到1所在的位置后,其余各个数字的正确位置就是固定的,我们可以按照下列算法从数字2开始,一个一个地调整各个数字的位置。
a.确定数字i应处的位置
b.从数字i应处的位置开始,向后查找数字i现在的位置;
c.若数字i现在位置不正确,则将数字i从现在的位置(沿连线)移向中间的空格,而将原有位置空出。依次将现有空格前的所有元素向后移动,直到将i应处的位置空出,把它移入再次空出中间的空格。
从数字2开始使用以上过程,就可以完成全部数字的移动排序。
编程时要将矩阵的外边八个格看成一个环,且环的首元素是不定的。如果算法设计的不好,程序中就要花很多的精力来处理环中元素的前后顺序问题。将题目中的3x3矩阵用一个一维数组表示,中间的元素(第四号)刚好为空格,设计另一个指针数组,专门记录矩阵外边八个格构成环时的连接关系。指针数组的每个元素依次记录环中数字在原来数组中的对应的元素下标。这样通过指针数组将原来矩阵中复杂的环型关系,表示成了简单的线性关系,从而大大简化了程序设计。
2.程序与程序注释
#include <stdio.h>
#include <stdlib.h>