关于右上角型的蛇形矩阵问题

待删

关于右上角型的蛇形矩阵问题
在这里插入图片描述
如图,这种类型的矩阵就称为蛇形矩阵。给定一个n,矩阵的规格便是n
n了。而网上题目大多是从左上角为起点的蛇形矩阵,我就来写写右上角为起点的蛇形矩阵的题解。
那么,思路很简单。只要把1枚举到n
n,然后把值一一代到数组里去就好。
这题,难的是数组下标与枚举数的关系规律
但通过把一个个数以及对应数组的下标列举出来,规律花点心思也能看出来。下面是代码与注释:

#include <iostream>
#define N 101
using namespace std;

int main()
{
    int n,i=1,j,p=1,ox=1,bx=1,a[N][N];
    cin>>n;   //给定n值。
    j=n;    //起始元素应为a[1][n]。
    while(p<=n*n){    //p初值为1,枚举到最大值n*n,代入数组中。
        a[i][j]=p++;
        if(ox){    //很明显,给数组赋值的情况可以分为两大部分:一部分是元素下标的i值与j值共同加1,另一部分则是共同减1,改变的契机就是其中一个值达到边缘;其次如果在边缘点的时候,还会出现“单个加1或减1”的情况。这里用ox值将两种情况分开。
            if(j==1){    //如果在ox值为1,j值为1的情况下,就执行i++的语句。这和下面的代码一样属于观察出来的“规律”。
                i++;
                ox=0;
            }else if(i==1){    //注意,虽然是i==1的情况先出现的,但因为数组在代入n*n的下半部分的时候,有出现过j和i同时等于1的情况,而那种情况就应该以j==1为判断基准,故j==1的情况写在i==1情况之前。
                j--;
                ox=0;
            }
            if(ox){   //注意要用ox值判断是否执行共同减1,这是为了让上面if语句执行后不再继续执行共同减1的操作。
                i--;   //i值和j值共同减1.
                j--;
            }
        }else{   //原理同上,不多赘述。
            if(i==n){
                j--;
                ox=1;
            }else if(j==n){
                i++;
                ox=1;
            }
            if(!ox){
                i++;
                j++;
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cout<<a[i][j]<<" ";   //输出数组。
        }
        cout<<endl;
    }
    return 0;
}

规律还是挺费心思才能找到的。本人在此题不是使用for循环将值一一代入数组中,而是使用p自加的操作代入数组,感觉貌似更好理解了一点。
代码如上,欢迎讨论。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值