给你一个整数n,输出n∗n的蛇形矩阵。
输入描述:
输入一行,包含一个整数n
输出描述:
输出n行,每行包含n个正整数,通过空格分隔。
1<=n<=1000
输入样例:
4
输出样例:
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
思路: 蛇形三角形和蛇形填数的升级版,多个分别奇偶讨论而已。n为奇数和n为偶数时,斜着填数的次数不同。#include <bits/stdc++.h>
using namespace std;
int arr[1010][1010];
int n;
void solve()//把矩形分为两个三角形(1,1)(1,n)(n,1)组成,(1,n)(n,n)(n,1)组成
{
arr[1][1]=1;//起点初始化
int tot=1;//计数器初始化
int x=1,y=1;//坐标初始化
if(n%2==0)//n为偶数
{
while(tot<n*n) //先填左上角的
{
arr[x][++y]=++tot;//遇到上边界向右填数
while(arr[x+1][y-1]==-1) arr[++x][--y]=++tot;//判断下个点,是否在矩阵范围内并斜左下填数
if(tot==(((n*n)/2)+n/2)) break;//填到对角线的时候退出,找规律即可
arr[++x][y]=++tot;//遇到左边界向下填数
while(arr[x-1][y+1]==-1) arr[--x][++y]=++tot;//斜右上填数
}
while(tot<n*n)//继续补完
{
arr[x][++y]=++tot;//同理可得
while(arr[x-1][y+1]==-1) arr[--x][++y]=++tot;
arr[++x][y]=++tot;
while(arr[x+1][y-1]==-1) arr[++x][--y]=++tot;
}}
else//n为奇数,遇到对角线情况退出的位置不同,其余类似
{
while(tot<n*n)
{
arr[x][++y]=++tot;
while(arr[x+1][y-1]==-1) arr[++x][--y]=++tot;
arr[++x][y]=++tot;
while(arr[x-1][y+1]==-1) arr[--x][++y]=++tot;
if(tot==((n*n)/2+n/2+1)) break;
}
while(tot<n*n)
{
arr[++x][y]=++tot;
while(arr[x+1][y-1]==-1) arr[++x][--y]=++tot;
arr[x][++y]=++tot;
while(arr[x-1][y+1]==-1) arr[--x][++y]=++tot;
}
}
return ;
}
int main()
{
int i,j;
cin>>n;
for(i=1;i<=n;i++)//给矩阵划上范围,先让矩阵里的值都为-1
for(j=1;j<=n;j++) arr[i][j]=-1;
solve();
for(i=1;i<=n;i++)//输出矩阵
{
for(j=1;j<=n;j++) cout<<arr[i][j]<<" ";
cout<<endl;
}
}