
该程序实现了一个蛇形填充n×n矩阵的算法。通过定义方向变量d(0表示右上,2表示左下),交替进行对角线填充:当向右上方超出边界时转向左下方,反之亦然。填充从a[0][0]=1开始,依次递增至n²。最后通过printArr函数输出填充完成的矩阵。核心逻辑是通过判断边界条件动态调整填充方向,实现蛇形走位填充二维数组。该算法时间复杂度为O(n²),空间复杂度为O(n²)。
cpp
#include <stdio.h>
#include <math.h>
#define M 1001
int a[M][M];
void fun(int n){
int k=1,i=0,j=0;
int d =0; //0右上角 2左下角
a[0][0]=k;
while(k<=n*n){
k++;
if(d==0){ //右上角 i--,j++
i--,j++;
if(j==n){ //超出右边了,
i+=2,j--;
d=2; //改方向
}else if(i<0){
i++;
d=2; //改方向
}
a[i][j]=k;
continue;
}
if(d==2){//左下角
i++,j--;
if(i==n){
i--,j+=2;
d=0;
}else if(j<0){
j++;
d=0;
}
a[i][j]=k;
continue;
}
}
}
printArr(int n){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%d ",a[i][j]);
puts("");
}
}
int main() {
int n;
scanf("%d",&n);
fun(n);
printArr(n);
return 0;
}