牛客题目链接: 蛇形矩阵_牛客题霸_牛客网
一·习题简述思路:
首先,我们可以根据题目给出的n为4来找规律来实现:首先观察斜对线数字,可以发现它们当数字向上增加的时候:这时候下标之和就是偶数,反之,向下增加就是奇数。然后,由于我们要遍历n阶矩阵,假设它的下标为i j,那么每次遍历完,i与j之和都会变化,故我们设置一个count=i+j,每次遍历完整个矩阵就+1。这样在n为4的情况下,故count为0-6每次在count固定就完成一遍遍历数组,找i+j=count的位置按照蛇的绕行方向放入数据,最后就会把该矩阵布置好。
二·画图详解 :
三·解题代码及注释展示:
#include <stdio.h>
#include<stdlib.h>
int main() {
int n;
scanf("%d", &n);
int i = 0;
int j = 0;
int count = 0;//这里count为每个数据下标i与j的和就存数据
int num=1;//这里num++为升序的每次要放的数据
int(*arr)[n]=(int(*)[n])malloc(sizeof(int)*n*n);//这里为了节约利用空间,定义了数组指针来开辟二维数组空间
while (count <= 2 * n - 2) {
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (i + j == count) {
if (count % 2 == 0) {//i+j为偶数,则斜向上走,这里考虑到如果直接打印i和j,他会从头开始i j重新遍历,可能会存在大数比小数先遍历到故先放小数故先j 后i
arr[j][i] = num;
num+=1;
} else {//i+j为奇数,则斜向下走
arr[i][j] = num;
num+=1;
}
}
}
}
//这里我们要填入的数据就是i+j为count的,根据由于n取值不同count也就不同来找对应的i与j,遍历整个i j找到符合要求的按蛇身顺序放入,每次遍历完ij就count++
count++;//这里count最大就是i+j的最大即2n-2
}
//打印矩阵
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
解读大佬有关此题写法有感,而研究解法而作,此文虽简陋,望有不足之处,望大佬们多多指导。