蛇形矩阵(附加AC代码)

题目

给你一个整数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;
}

雀食很难😭

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值