待删
关于右上角型的蛇形矩阵问题
如图,这种类型的矩阵就称为蛇形矩阵。给定一个n,矩阵的规格便是n
n了。而网上题目大多是从左上角为起点的蛇形矩阵,我就来写写右上角为起点的蛇形矩阵的题解。
那么,思路很简单。只要把1枚举到nn,然后把值一一代到数组里去就好。
这题,难的是数组下标与枚举数的关系规律。
但通过把一个个数以及对应数组的下标列举出来,规律花点心思也能看出来。下面是代码与注释:
#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自加的操作代入数组,感觉貌似更好理解了一点。
代码如上,欢迎讨论。