问答题
[说明]
以下C语言程序实现了生成从里到外是连续的自然数排列的回旋矩阵,矩阵形式如下:
7 6 5 16
8 1 4 15
9 2 3 14
10 11 12 13
程序的变量说明如下:
x1:矩阵上边界;
x2:矩阵下边界;
y1:矩阵左边界;
y2:矩阵右边界;
s:数组元素升降标记,s等于1为升,s等于-1为降;
a[]:存放矩阵元素的数组。
仔细阅读C语言程序源码,将{{U}} (n) {{/U}}处的语句补充完整。(注:每处仅一个语句)
[C程序]
#include<stdio.h>
void main ( )
{
const int N=20;
int i=0,j=0,a[N][N],n;
int m,x1,x2,y1,y2,s;
while (1)
{
Printf ("/ninput matrix row N( N>=2): ");
scanf ("%d",&n);
printf ("/n");
if (n>=2)
break;
}
m=n*n;
x1=0; y1=0; x2=n; y2=n;
if(n%2==0)
{j=n-1; y2=n-1; s=1;}
else
{i=n-1; y1=1; s=-1; }
while (1)
{
if (s==1)
{
for (i; i<x2; i++) a[i][j]=m--;
i--;
j--;
{{U}} (1) {{/U}}
for (j;j>=y1;j--) a[i][j]=m--;
j++;
i--;
y1++;
{{U}} (2) {{/U}}
}
else
{
for (i;i>=x1;i--)
a[i][j]=m--;
i++;
j++;
{{U}}(3) {{/U}}
for (j;j<y2;j++)
{{U}}(4) {{/U}}
{{U}}(5) {{/U}}
i++;
{{U}}(6) {{/U}}
S=i;
}
if (m<1) break;
}
for (i=O;i<n; i++)
{
for (j=O;j<n;j++)
printf ("%6d",a[i][j]);
printf ("/n");
}
printf ("/n");
}
【正确答案】
【答案解析】(1)x2--;
(2)s=-1;
(3)x1++;
(4)a[i][j]=m--;
(5)j--;
(6)y2--;
[解析] 自然数排列的回旋矩阵是一个经典程序设计题目。本题中生成的是一个从里到外是连续的自然数排列的回旋矩阵。仔细阅读代码,能够发现(1)处应该为矩阵下边界递减;(2)处应该为数组元素递减状态,即为降;(3)处应该为矩阵上边界递增;(4)处应该为存放矩阵元素的数组中的数据递减;(5)处应该为数组元素的列序号递减,即j--;(6)矩阵右边界递减。