很郁闷,帮忙解释一下

lupenda 2003-10-05 09:42:23
[程序说明]

本程序将自然数 1,2,……,N2 按蛇形方式逐个顺序存入 N 阶矩阵。

例如,当 N = 3 和 4 时分别如图 3.1 和图 3.2。


7 13 14 16
6 7 9 6 8 12 15
2 5 8 2 5 9 11
1 3 4 1 3 4 10
图3.1 图3.2

从 an0 开始到 a0n 为止(n = N-1)顺序填入自然数,交替地对每一斜列从左上元素向右下元素或从右下元素向左上元素存数。
[程序]

#include

#define SIZE 10

int a[SIZE] [SIZE], k;

main()

{ int i, j, n, N;

for (N = 3;N<=SIZE; N++)

{ k = 1;

makeArray (n = N-1);

printf ("\nN = %d;\n",n+1);

for (i = 0;i<=n; i++)

{ for (j = 0; j<=n; j++)printf("%4d",a[i][j]);

printf ("\n");

}

}

}

makeline (int row_start, int col_start, int row_end)

{ /*完成矩阵一条斜线的整数填写*/

int i, j, sign = ____(1)____;

for (i = row_start, j = col_start;____(2)____ >=0; i += sign,j += sign)

a[i][j] = k++;

}

makeArray (int n)

{ /* 完成矩阵每条斜线的整数填写*/

int d;

for (d = 1; d <= ___(3)___; d++)

if (d <= n);

if (d%2) makeline (____(4)____); else makeline(____(5)____);

else

if (d%2) makeline (____(6)____); else makeline(____(7)____);

}




答案:
(1)row_start<row_end?:-1

或((row_end-row_start)>0)*2-1 和其它等价形式

(2)(row_end-i)*sign(3分)

(3)2*n+1(3分)

(4)n,d-1,n+1-d(3分)

(5)n+1-d,0,n(3分)

(6)2*n-d+1,n,0(3分)

(7)0, d-n-1, 2*n-d+1(3分)

...全文
33 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
levinjoe 2003-10-07
  • 打赏
  • 举报
回复
再次说sorry,以上代码有问题,看错坐标原点了,i+j不等于N-1,再增加一个变量,并一起变化就可以了;
lupenda 2003-10-07
  • 打赏
  • 举报
回复
已经明白
levinjoe 2003-10-07
  • 打赏
  • 举报
回复
sorry,改为a[n-1-j][j]=N*N+2-k;没注意k++;
levinjoe 2003-10-07
  • 打赏
  • 举报
回复
很简单啊,考虑到交错变方向,
(1)由起始行与结束行大小判断,斜线的方向(如2的行号小于3,为向下,行编号递增);
(2)考虑到每条斜线行列之和为N-1,利用行和列均可判断,题中用行来判断,*符号位是保证为正);
(3)很明显是斜线编号,1到2*N-1,因而用2*(N-1)+1结束;
分两步分,小于等于N为上三角(对应代数下三角),大于N为对称下三角)
(4)(5)为上三角处理,并按奇偶区分递增方向,分别处理;
(6)(7)为下三角处理,并按奇偶区分递增方向,分别处理;
关键是注意到a[i][j]有 i+j=N-1;
且 0<=i,j<=N-1;

总而言,程序过分强调结构化,比较繁,适合做考题,事实上利用对称性,上下三角可同时处理;
用:
sign=1,k=1,start,end,;
for(i=N-1; i>0 ; i-- )
{
sign*= -1;
if(sign>0)
{
start=n-1-i;
end=n-1;
}
else
{
start=n-1;
end=n-1-i;
}
for(j=start;j<=end; j+=sign)
{
a[j][n-1-j]=k++;
a[n-1-j][j]=N*N+1-k;
}
}


jingfeng198 2003-10-05
  • 打赏
  • 举报
回复
xian up

zaikan
lupenda 2003-10-05
  • 打赏
  • 举报
回复
两个图是这样的:
7 14 15 21 22 24
6 7 9 6 8 13 16 20 23
2 5 8 2 5 9 12 17 19
1 3 4 1 3 4 10 11 18

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧