将数字1,2,3....N2(N>=2)按逆时针方向依次写到N*N矩阵中
标签:
杂谈 |
分类: C |
【说明】
本流程图将数字1,2,…,N2(N≥2)接逆时针方向依次写在N×N的矩阵中。下面给出了N=4和N=5的情况:
|
1 |
12 |
11 |
10 |
1 |
16 |
15 |
14 |
13 |
|
2 |
13 |
16 |
9 |
2 |
17 |
24 |
23 |
12 |
|
3 |
14 |
15 |
8 |
3 |
18 |
25 |
22 |
11 |
|
4 |
5 |
6 |
7 |
4 |
19 |
20 |
21 |
10 |
|
(N=4时) |
5 |
6 |
7 |
8 |
9 |
|||
|
(N=5时) |
||||||||
【问题1】
填充流程图中的①至⑥,使之成为完整的流程图。
【问题2】
若将数字1,2,…,N2按顺时针方向依次写在N×N矩阵中,则只需将上述流程图中的
http://s9/middle/798f21a0hb01c4a2a17f8&690
例题11分析
通过阅读流程图,可以知道程序开始先初始化变量M和K为1。然后进入一个大until循环中,该循环体由4个小until循环组成,其循环判断条件分别为①、②、③、④,可以定义为循环①、②、③、④。
在4个小循环的循环体中都有语句M→A[I,J]。M在每次循环中增1,所以可以确定A[I,J]描述的是N×N矩阵中某个位置,其中I为矩阵的行,J为矩阵的列;而M是向矩阵中填入的数字,即为给定的数字1,2,3,…,N2。
根据4个循环I、J变换的顺序知道:循环①中J值不变,I 值每循环一次加1,即列号不变,行号递增,从上往下将值写入矩阵中;循环②中I值不变,J值每循环一次加1,即行号不变,列号递增,从左往右将值写入矩阵中;循环③中J值不变,I值每循环一次减1,即列号不变,行号递减,从下往上将值写入矩阵中;循环④中J值不变,I值每循环一次减1,即行号不变,列号递减,从右往左写入矩阵中,其轨迹为一个逆时针正方形边框。
4个小循环结束以后,变量K值加1,则K控制大循环的次数,其循环次数为K=[N/2],每次大循环开始都将I、J设置为K值。如果将A[I,J]看成数组,则每次大循环都是从数组的对角线上开始的。即第一次大循环K=1,从A[K,K]=A[1,1]开始,其轨迹的对角线的起点为A[K,K],终点为A[N-K+1,N-K+1];第二次大循环K=2,从A[K,K]=A[2,2]开始,其轨迹的对角线的起点为A[K,K],终点为A[N-K+1,N-K+1]……
根据上面的分析,来分析确定4个小循环的判断条件(以第K次循环为例)。开始循环前I=J=K,其各个循环的I、J变换规则与界限如下:
循环①中J=K,I 值每循环一次加1,则I的下界为N-K+1。
循环②中I=N-K+1值不变,J值每循环一次加1,则J的上界为N-K+1。
循环③中J=N-K+1值不变,I值每循环一次减1,则I的下界为K。
循环④中I=K值不变,J值每循环一次减1,则J的下界为K。
由于程序流程采用until型循环,先进行M→A[I,J]数组赋值操作,再进行I或J的增加或减少操作。由于I、J不能操作所给定的界限,所以给出循环条件必须谨慎。
循环条件①判断条件为"≤"时,就进行循环。根据上面对循环①的分析,可以确定退出循环时I= N-K+1,所以当为I≤N-K+1-1时进入循环,即I≤N-K。同理,循环条件②为J≤N-K。
循环条件③判断条件为"≤"时,就进行循环。根据上面对循环③的分析,可以确定退出循环时I=K,所以当I≤K-1时进入循环。同理,循环条件④为J≤K-1。
当系统退出大循环时,如果N为偶数则N/2=[N/2],则矩阵所有数据填写完毕;如果N为奇数,则N/2>[N/2],则矩阵的中心还没有填写。矩阵中心的位置为A[[N/2]+1, [N/2]+1],根据处理流程退出大循环后K=[N/2]+1。所以退出大循环后还需要判断是否到中心,即N是否为偶数。用数学式描述是N mod 2=0。如果为奇数则要求M→A[K,K],这也就是判断⑤和处理⑥的结果。
只要将矩阵的行列互换,就得到将字1,2,…,N2按顺时针方向写入的矩阵。在流程图中,I代表行,J代表列,将J与I互换即可达到行列互换的目的,所以只要将A[I,J]改成A[J,I]即可。
例题11参考答案
【问题1】
① I:N-K 或 I:N-J 或 M:4(K-1)(N-K+1)+N-2K+1
② J:N-K 或 J:N-1 或 M:4(K-1)(N-K+1)+2(N-2K+1)
③ I:K+1 或 I:N+2-J 或 4(K-1)(N-K+1)+3(N-2K+1):M
④ J:K+1 或 J:I+1 或 4K(N-K):M
⑤ MOD(N,2):0 或 [N/2]*2:N 或 [N/2]:[N+1/2] 或 N/2: [N/2] 或 [N/2]:[N/2] 或 N:2(K-1) 或 I+J=N 或 M-1:N2
⑥ M→A[K,K]
【问题2】
⑦ A[I,J] 或 M→A[I,J]
⑧ A[J,I] 或 M→A[J,I]
来自http://book.51cto.com/art/200903/114128.htm

加载中…