题目
思路
-
采用前开后闭原则,填充上行从左到右,填充右列从上到下,填充下行从右到左,填充左列从下到上。
-
当n为奇数时,最中间的值需要特殊处理,即最后一个数,不需要被遍历,直接赋值即可。
#include<stdio.h>
void generate(int n,int a[100][100]);
void print(int n,int a[100][100]);
int main(){
int n,a[100][100];
scanf("%d",&n);
generate(n,a);
print(n,a);
return 0;
}
void generate(int n,int a[100][100]){
int x=0,y=0;//每圈的起始位置
int loop=n/2;//一共循环圈数
int mid=n/2;//矩阵中间位置
int cnt=1;//填充矩阵中每个格子的值
int offset=1;//控制每一条边遍历的长度
int i,j;//遍历指针
while(loop--){
i=x;
j=y;
while(j< n-offset){
a[i][j]=cnt++;
j++;
}
while(i< n-offset){
a[i][j]=cnt++;
i++;
}
while(j>y){
a[i][j]=cnt++;
j--;
}
while(i>x){
a[i][j]=cnt++;
i--;
}
x++;
y++;
offset++;
}
if(n%2==1){//奇数,最中间的值需特殊处理。
a[mid][mid]=cnt;
}
}
void print(int n,int a[100][100]){
int i,j;
for(i=0; i<n; i++){
for(j=0; j<n; j++)
printf("%-4d",a[i][j]);
printf("\n");
}
}
注意
-
这个题已经见过很多次了,题目很熟悉了还是不能完整写出代码,还是写的少。
-
这种题不用什么算法,考察上机的实操能力,所以要多写,就能熟练。