① 倒填 ② 蛇形填数 ③ 回转填数 这个你应该看的懂吧
你在表中从1数到25就知道怎么填的了
然后再看程序 应该很简单的啊 你得把程序循环得层次弄清楚
例如③ 回转填数
int i,j,k=1,m,mi,mj,a[NUM][NUM],ind[4]={NUM-1,NUM-1,0,1}; /*i为行号,j为列号,k当前填的数,数组ind[4]在回转填数中控制圈数*/
/*cycle*/
printf("cycle:\n");
k=1;i=0;j=0;
while(ind[0]>=ind[2]) /*控制数组填数循环,ind[0]>=ind[2]表示到达最里边一圈,即结束填数*/
{while(i<=ind[0]) /*第一列填k=1到5,i为行号,j为列号=0*/
{a[i][j]=k;i++;k++;}
ind[0]--;i--;j++; /*ind[0]--后为3,表示填数i在上边循环结束后为5故减i--,j++为下边从第二列开始填数做准备*/
while(j<=ind[1]) /*此时i=4,j=1,第5行第2列开始填k=6到9*/ {a[i][j]=k;j++;k++;}
ind[1]--;j--;i--; /*ind[1]=3,j=4,i=4*/
while(i>=ind[2]) /*此时i=3,j=4,第4行第5列开始填k=10到13*/
{a[i][j]=k;i--;k++;}
ind[2]++;i++;j--; /*ind[2]=1表示第一圈结束*/
while(j>=ind[3])
{a[i][j]=k;j--;k++;}
ind[3]++;j++;i++;}
for(i=0;i
if(j==NUM-1) printf("\n");}
printf("\n");
getch();
}
没注释的以此类推啊 差不多了
倒填的意思就是矩阵中的数是从最大的开始逐步减小,C语言中的公式是a[i][j]=N*N-N*i-j,使用这个公式从a[0][0],a[0][1],a[0][2]依次填充就可以了
蛇形填数就是从左上角开始如图2中的填法,a[0][0],1[1][0],a[0][1],a[0][2],a[1][1],a[2][0],a[3][0]....的顺序填充。因此就不要从a[0][0],a[0][1],a[0][2]依次填充了,而改成计算要填充的位置。
回转填充看起来更像一条盘卧的大蛇,同样应采用计算要填充的位置的方法,先算1的位置,得到a[0][0],再算2的、3的,直到遇到拐弯,就换个方向
再配合你手中的源代码是不难理解的
什么意思
对于二维以及多维数组掌握规律是其中的关键,初学者可以一项项的把结果列出来,不要怕麻烦,仔细观察就应能很好的找到规律,倒填很简单,我就不说了,下面就以蛇形填数来说一下:
仔细观察能够发现,蛇形填数中,我们以数组的每一斜行为单位来看,数组A的下标I、J之和为单数,数据的输入顺序是从下向上,和为双数,输入顺序是从上向下,并且每一歇行的坐标之和相等.
所以根据输入顺序分析,我们就可以根据数组下标之和的单双来选择输入顺序./* snake */
printf("snake:\n");
k=1;
for(m=0;m<=(NUM-1)*(NUM-1);m++) /*数组下标和最大为M*/
for(i=0;i
{if(m%2==0) ?*判断下标和为单数还是双数*/
{a[i][j]=k;k=k+1;} /*双数, 输入顺序为从上向下*/
else
{a[j][i]=k;k=k+1;} /*单数,输入顺序为从下向上*/
}
}
for(i=0;i
if(j==NUM-1) printf("\n");}
printf("\n");
真么难啊