给你一个整数n,按要求输出n∗n的回型矩阵(带详细教程)

给你一个整数n,按要求输出n∗n的回型矩阵

注意1<=n<=19
在这里插入图片描述
代码描述

#include <stdio.h>
int main(){
    
    
    int n, i = 0, j = 0, a[20][20] = {
    
    0}, tot = 0;
    scanf("%d", &n);
    int num = a[0][0] = 1;			//无论如何他都从数组的第一个开始吧 
    while (num < n*n){
    
    			//那它总共需要N*N个数字吧 
        while (j+1 < n && !a[i][j + 1]){
    
    
			a[i][++j] = ++num;
		}  
        while (i +1 < n && !a[i + 1][j]){
    
    
			a[++i][j] = ++num;
		} 
        while (j-1 >= 0 && !a[i][j - 1]){
    
    
			a[i][--j] = ++num;
		}
        while (i -1>= 0 && !a[i - 1][j]){
    
    
			a[--i][j] = ++num;
		}
		 
    }
    for (i = 0; i < n; i++){
    
    
        for (j = 0; j < n; j++){
    
    
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}
}

解题思路:

  • 无论如何他都从数组的第一个开始吧 ,那就给他先赋值1;
  • 一共要填n*n个数字吧,那最后一个数字我是不是知道呢?
  • 剩下的你阅读代码先自己思考一下LOL。

补上思考题:

为什么要初始化数组为0?
为什么每一个while循环都要判断一次(!a[i][j + 1])?
它是怎么实现往转圈的?


如果你对上面几问有了比较清晰的认识的话,那么从开始出发,(本着代码越少,逻辑越复杂的定理,我慢慢解释嗷, 大佬就放过我吧

一、既然确定了个数N*N个,那么我们的思路是,铁定要通过循环来构造出一个给数组元素来赋值的程序段;

二、首先最能想到的是,给第一行赋值,在控制列数的情况下有很多的方法给第行赋值,对吧?例如for循环了,while了,只要不被越界,num自增赋值就行咯,对不对(写到这里我还没想到如何往回返也就是限制条件没写!a[i][j + 1]);

三、接着赋值最右边的一列,此时咋们的j(j代表列数)会自增到最后一列,也就是j不变了,i(i代表行数)自增,同时赋值数组元素自增,此时通过两轮循环就把最上边一行和最右边的一列给依次赋值完毕;
此时的i、j都停留在了右下角,那么不变“行值i”,将一个j往后自减,哎,这不就自动把最下面一行一次赋值了嘛;

四、接着在往上走(在最左边),那么问题来了兄弟们:什么时候停止这个赋值呢? 要是按照咱们的while条件里左边的限制条件的话,会出 神马问题?,奥利给一下,是不是会覆盖掉这个原来的值呀,那么进入新一轮循环的时候就只会在最外层转圈圈呢……

五、如何解决这个问题呢,宝。(好,给你五秒钟思考,不能再多了)哈哈哈,咋们在初始化数组的时候是不是都赋值为0了,那么 !0为真,!(其他数) 为假,也就是说我赋值过的都为假,那么根据咋们设置的条件就不会在往下退了,有木有道理哇;

六,再然后重复咱们理论上的(一,二,三,四,五)就慢慢啊的填满了这个数组咯。唉,是不是有种恍然大明白的感觉了呢……

Guess you like

Origin blog.csdn.net/m0_46672781/article/details/121306671