oj刷题之蛇形矩阵的实现与讲解

发布于:2024-05-20 ⋅ 阅读:(143) ⋅ 点赞:(0)

牛客题目链接: 蛇形矩阵_牛客题霸_牛客网

一·习题简述思路:

首先,我们可以根据题目给出的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;
}

 

解读大佬有关此题写法有感,而研究解法而作,此文虽简陋,望有不足之处,望大佬们多多指导。

 


网站公告

今日签到

点亮在社区的每一天
去签到