给你一个整数n,按要求输出n∗n的回型矩阵(带详细教程)
Posted 勇敢*牛牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给你一个整数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为真,!(其他数) 为假,也就是说我赋值过的都为假,那么根据咋们设置的条件就不会在往下退了,有木有道理哇;
六,再然后重复咱们理论上的(一,二,三,四,五)就慢慢啊的填满了这个数组咯。唉,是不是有种恍然大明白的感觉了呢……
以上是关于给你一个整数n,按要求输出n∗n的回型矩阵(带详细教程)的主要内容,如果未能解决你的问题,请参考以下文章