请C语言编程高手帮忙帮我看看下面的题目

题目如下:
矩阵中填数. 当给出 N*N 的矩阵,要求用程序填入下列形式的数:

① 倒填,例如N=5 ② 蛇形填数 ③ 回转填数

┌—┬—┬—┬—┬—┐ ┌—┬—┬—┬—┬—┐ ┌—┬—┬—┬—┬—┐
│25│24│23│22│21│ │ 1│ 3│ 4│10│11│ │ 1│16│15│14│13│
├—┼—┼—┼—┼—┤ ├—┼—┼—┼—┼—┤ ├—┼—┼—┼—┼—┤
│20│19│18│17│16│ │ 2│ 5│ 9│12│19│ │ 2│17│24│23│12│
├—┼—┼—┼—┼—┤ ├—┼—┼—┼—┼—┤ ├—┼—┼—┼—┼—┤
│15│14│13│12│11│ │ 6│ 8│13│18│20│ │ 3│18│25│22│11│
├—┼—┼—┼—┼—┤ ├—┼—┼—┼—┼—┤ ├—┼—┼—┼—┼—┤
│10│ 9│ 8│ 7│ 6│ │ 7│14│17│21│24│ │ 4│19│20│21│10│
├—┼—┼—┼—┼—┤ ├—┼—┼—┼—┼—┤ ├—┼—┼—┼—┼—┤
│ 5│ 4│ 3│ 2│ 1│ │15│16│22│23│25│ │ 5│ 6│ 7│ 8│ 9│
└—┴—┴—┴—┴—┘ └—┴—┴—┴—┴—┘ └—┴—┴—┴—┴—┘
解答已经知道,但看不那么懂,哪位高手帮忙写一下解答的程序运行说明和流程图或算法。
#define NUM 5
main()
{int i,j,k=1,m,mi,mj,a[NUM][NUM],ind[4]={NUM-1,NUM-1,0,1};
clrscr();
for(i=0;i<NUM;i++)
for(j=0;j<NUM;j++)
{a[i][j]=k;k++;}
/* back*/
printf("back:\n");
for(i=NUM-1;i>=0;i--)
for(j=NUM-1;j>=0;j--)
{printf("%4d",a[i][j]);
if(j==0) printf("\n");
}
printf("\n");
/* snake */
printf("snake:\n");
k=1;
for(m=0;m<=(NUM-1)*(NUM-1);m++)
for(i=0;i<NUM;i++)
for(j=0;j<NUM;j++)
{if((i+j)==m)
{if(m%2==0)
{a[i][j]=k;k=k+1;}
else
{a[j][i]=k;k=k+1;}
}
}
for(i=0;i<NUM;i++)
for(j=0;j<NUM;j++)
{printf("%4d",a[i][j]);
if(j==NUM-1) printf("\n");}
printf("\n");
/*cycle*/
printf("cycle:\n");
k=1;i=0;j=0;
while(ind[0]>=ind[2])
{while(i<=ind[0])
{a[i][j]=k;i++;k++;}
ind[0]--;i--;j++;
while(j<=ind[1])
{a[i][j]=k;j++;k++;}
ind[1]--;j--;i--;
while(i>=ind[2])
{a[i][j]=k;i--;k++;}
ind[2]++;i++;j--;
while(j>=ind[3])
{a[i][j]=k;j--;k++;}
ind[3]++;j++;i++;}
for(i=0;i<NUM;i++)
for(j=0;j<NUM;j++)
{printf("%4d",a[i][j]);
if(j==NUM-1) printf("\n");}
printf("\n");
getch();
}

急!!!!
请哪位高手帮小女子写一下了
小女子先谢谢了!!!!!!!!!
要是帮忙写下算法就好了,谢谢个位的回答。我现在明白了,但老师叫我写什么算法,我想了半天也不知道怎么动笔,什么是算法 ,晕
5555555---

第1个回答  2007-08-07
① 倒填 ② 蛇形填数 ③ 回转填数 这个你应该看的懂吧
你在表中从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<NUM;i++) /*输出数组*/
for(j=0;j<NUM;j++)
{printf("%4d",a[i][j]);
if(j==NUM-1) printf("\n");}
printf("\n");
getch();
}

没注释的以此类推啊 差不多了本回答被提问者采纳
第2个回答  2007-08-07
倒填的意思就是矩阵中的数是从最大的开始逐步减小,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的,直到遇到拐弯,就换个方向

再配合你手中的源代码是不难理解的
第3个回答  2007-08-07
什么意思
第4个回答  2007-08-07
对于二维以及多维数组掌握规律是其中的关键,初学者可以一项项的把结果列出来,不要怕麻烦,仔细观察就应能很好的找到规律,倒填很简单,我就不说了,下面就以蛇形填数来说一下:
仔细观察能够发现,蛇形填数中,我们以数组的每一斜行为单位来看,数组A的下标I、J之和为单数,数据的输入顺序是从下向上,和为双数,输入顺序是从上向下,并且每一歇行的坐标之和相等.
所以根据输入顺序分析,我们就可以根据数组下标之和的单双来选择输入顺序./* snake */
printf("snake:\n");
k=1;
for(m=0;m<=(NUM-1)*(NUM-1);m++) /*数组下标和最大为M*/
for(i=0;i<NUM;i++)
for(j=0;j<NUM;j++)
{if((i+j)==m) /*确定每一斜行的下标和是否和M相等*/
{if(m%2==0) ?*判断下标和为单数还是双数*/
{a[i][j]=k;k=k+1;} /*双数, 输入顺序为从上向下*/
else
{a[j][i]=k;k=k+1;} /*单数,输入顺序为从下向上*/
}
}
for(i=0;i<NUM;i++) /*输出数组*/
for(j=0;j<NUM;j++)
{printf("%4d",a[i][j]);
if(j==NUM-1) printf("\n");}
printf("\n");
第5个回答  2007-08-07
真么难啊
相似回答
大家正在搜