蛇形矩阵

链接:https://ac.nowcoder.com/acm/problem/22231
来源:牛客网

题目描述
给你一个整数n,输出n∗n的蛇形矩阵。
输入描述:

输入一行,包含一个整数n

输出描述:

输出n行,每行包含n个正整数,通过空格分隔。

1<=n<=1000

示例1
输入
复制

4

输出
复制

1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16

对矩阵的每一个元素分析下后,你会发现,对于沿着主对角线向右走,与主对角线垂直的斜线一共又2*n-1条,并且,这每一条线上的元素横纵坐标之和为一个定值;(以n=4为例)
a[0][0]=1 0+0 = 0

a[0][1]=2 1+0 = 1 =i
a[1][0]=3 0+1 = 1

a[2][0]=4
a[1][1]=5
a[0][2]=6 2

a[0][3]=7
a[2][1]=8
a[1][2]=9
a[0][3]=10 3

直到下标之和为n,相当于把与主对角线垂直的左半边处理完毕(左上角,一直到最长的对角线),然后写右下角的规律
a[1][4]=16
a[2][3]=17
a[3][2]=18
a[4][1]=19 5

a[4][2]=20
a[3][3]=21
a[2][4]=22 6

a[3][4]=23
a[4][3]=24 7

a[4][4]=25 8

分为两段来看,你会发现,对于左上角当下标之和为奇数时,行坐标递增,列坐标递减,开头的行坐标为0,当下标之和为偶数时,行坐标递减,列坐标递增,开头的行坐标为i,
分析后半部分你会发现:开头总有一个最大值4,当i为奇数时在列坐标上,当i为偶数时在行坐标上,并且递减,与另一个坐标的关系为i-(n-1);

#include <iostream>

using namespace std;

void snakeMatrix(int n){
	int k =1;
	int max[n][n];
	for(int i=0;i<n;i++){
		if(i%2==0){
			for(int j=i;j>=0;j--){
				max[j][i-j]=k++;
			}
		}
		else{
			for(int j =0;j<=i;j++){
				max[j][i-j] = k++;
			}
		}
	} 
	for(int i=n;i<2*n-1;i++){
	    if(i%2==1){
	    	for(int j=n-1;j>=i-(n-1);j--){
	    		max[i-j][j] = k++;
			}
		}
		else{
			for(int j=n-1;j>=i-(n-1);j--){
				max[j][i-j] = k++;
			}
		}
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			cout<<max[i][j]<<" ";
		}
		cout<<endl;
	}	
}
int main(){
	int n;
	cin>>n;
   snakeMatrix(n); 
   return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值