08 螺旋矩阵

21 阅读1分钟

题目

image.png

思路

  • 采用前开后闭原则,填充上行从左到右,填充右列从上到下,填充下行从右到左,填充左列从下到上。

  • 当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");
	} 
}

注意

  • 这个题已经见过很多次了,题目很熟悉了还是不能完整写出代码,还是写的少。

  • 这种题不用什么算法,考察上机的实操能力,所以要多写,就能熟练。