蛇形矩阵
题目:这个蛇形方阵大家都知道吧?不知道就看下面的矩阵找规律
蛇形方阵
【问题描述】
输入n,n≤100。输出n阶蛇形方阵。例如n=5时,输出如下:
1 2 6 7 15
3 5 8 14 16
4 9 13 17 22
10 12 18 21 23
11 19 20 24 25
算法:
1、那个先说一下,最近学了STL库的动态数组,是用这个编的(STL动态数组vector),有一些句子可以用后面注释着的替换,请各位原谅。
2、本算法就是纯模拟,没有用任何优化,各路高手请勿吐槽。
3、其实这个东西用心还是能找到规律的,当x、y坐标都为奇数或都为偶数时,往↗右上走,撞墙就往右或下走;
当x、y坐标一奇一偶时,往↙左下走,撞墙就往下或右走;(右或下 和 下或右是不一样的,右或下是不能右再下,反之亦然)
标程:
#include<bits/stdc++.h>
using namespace std;
int i,j,zi,n;
int main()
{
scanf("%d",&n);
vector<vector<int> >a;//就是定义一个数组a,可以写为:int a[10000][100000];
a.resize(n);//这个要是用int a[][]定义,就不要了。
for (i=0;i<n;i++)a[i].resize(n);//这个要是用int a[][]定义,就不要了。
i=0;j=0;zi=0;
while(zi<n*n)
{
zi++;
a[i][j]=zi;
if ((i%2==0&&j%2==0)||(i%2==1&&j%2==1))
{
if (j!=n-1)
{
i-=1;
j+=1;
}
else
{
i+=1;
}
}
else
if (((i%2==0)&&(j%2==1))||((i%2==1)&&(j%2==0)))
{
if (i!=n-1)
{
i+=1;
j-=1;
}
else
{
j+=1;
}
}
if(i<0)i=0;
if (j<0)j=0;
}
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
cout<<setw(5)<<a[i][j];//场宽输出,这个就是输出那个数,不足补空格
}
cout<<endl;
}
return 0;
}