【问题描述】
编程实现自动填充n×n矩阵元素数值,填充规则为:从第一行最后一列矩阵元素开始按逆时针方向螺旋式填充数值1,2,…,n×n,其中:n从键盘输入且3≤n≤20。最后向显示器输出该矩阵所有元素。
【输入形式】
输入一个正整数,为矩阵的行数和列数
【输出形式】
按行列顺序输出n×n矩阵的所有元素。
(1)每行n列矩阵元素均需在一行内输出显示
(2)输出每行矩阵元素后均需换行输出下一行,共输出n行
(3)每个矩阵元素数值的域宽均为4位且右对齐
【样例输入】
11
【样例输出】
11 10 9 8 7 6 5 4 3 2 1
12 49 48 47 46 45 44 43 42 41 40
13 50 79 78 77 76 75 74 73 72 39
14 51 80 101 100 99 98 97 96 71 38
15 52 81 102 115 114 113 112 95 70 37
16 53 82 103 116 121 120 111 94 69 36
17 54 83 104 117 118 119 110 93 68 35
18 55 84 105 106 107 108 109 92 67 34
19 56 85 86 87 88 89 90 91 66 33
20 57 58 59 60 61 62 63 64 65 32
21 22 23 24 25 26 27 28 29 30 31
【代码】
#include<stdio.h>
void Visit(int a[][400],int n)
{
int p=n-1,q=0,i;
int count=0;
while(count<n*n)
{
for(i=p;i>=q;i--)
{a[q][i]=count+1;
count+=1;}
for(i=q+1;i<=p;i++)
{a[i][q]=count+1;
count+=1;}
for(i=q+1;i<=p;i++)
{a[p][i]=count+1;
count+=1;}
for(i=p-1;i>=q+1;i--)
{a[i][p]=count+1;
count+=1;}
p--;
q++;
}
}
void Print(int a[][400],int n)
{ int h,j;
for(h=0;h<n;h++)
{
for(j=0;j<n;j++)
{printf("%3d ",a[h][j]);}
printf("\n");
}
}
int main()
{
int n,a[400][400];
scanf("%d",&n);
Visit(a,n);
Print(a,n);
return 0;
}
【注释与说明】
本题采用的思路为通过a[i][j]这种二维数组分别控制行和列的赋值,行坐标与列坐标中一个固定另一个for循环控制逐渐增加或减小