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

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

#include 
#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自加的操作代入数组,感觉貌似更好理解了一点。
题解结束,感谢观看,拜托点个赞吧!

你可能感兴趣的:(动态规划,leetcode,数据结构,算法)