题目
给你一个整数n,输出n∗n的蛇形矩阵,具体格式见样例。
输入
输入一行,包含一个整数n(1≤n≤1000)
输出
输出n行,每行包含n个正整数
样例
输入 1
4
输出 1
1 2 6 7 3 5 8 13 4 9 12 14 10 11 15 16
在此声明
本题和信息学奥赛一本通2045的【例5.13】蛇形填数不是同一个题!!!(看输出就知道)
蛇形矩阵
数字在矩阵中填充的顺序像蛇,我们可以模拟数字填充的方法(难难难)
给你一个整数n,输出n∗n的蛇形矩阵。
比如输入n=4,输出如下:
填充轨迹如下:
参考一下大佬 @明月本无心写的规律
斜向上——>斜向下——>斜向上——>……
那么问题来了
如何控制斜向上或者向下?
肯定要控制边界
箭头表示这个字是在哪个方向被填充数字的,还有一圈虚线画出的格子,称之为虚界。
虚界在矩阵中并不存在,但当矩阵的索引进入虚界,说明索引非法哦
假设矩阵名为a,横坐标为x,纵坐标为y
斜向上:s[x--][y++]
斜向下:s[x++][y--]
其实每一个数字按照哪个方向指向下一个数字在最开始已经确定了,如何能找出规律才是最重要的,想一下,是不是对角线延伸的(右上,左下)每次碰到边界后就会强行阻断之前的方向,否则将一直延续下去,而水平延伸(左右)之移动一次就会自动转方向,而且水平延伸的都在边界上。
code:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i,j,n;
int count = 1;
cin>>n;
int num[n+5][n+5];
for (i=0;i<n;i++)
{
if(i%2==0)
{
for(j=i;j>=0;j--)
{
num[j][i-j]=count++;
}
}
else
{
for(j=0;j<=i;j++)
{
num[j][i-j]=count++;
}
}
}
for(i=n;i<=2*n-1;i++)
{
if(i%2==0)
{
for(j=n-1;j>=i-(n-1);j--)
{
num[j][i-j]=count++;
}
}
else
{
for(j=n-1;j>=i-(n-1);j--)
{
num[i-j][j]=count++;
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<num[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
雀食很难😭