链接: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;
}