蛇形矩阵是一个n*n的矩阵,将整数1到n*n按照蛇形的顺序装入一个 n*n 的蛇形矩阵中,如样例所示分别为5阶和10阶蛇形矩阵。
输入格式:
只有一行,为一个整数n,代表蛇形矩阵的阶数,n的范围是1—100。
输出格式:
共n行,为蛇形矩阵。每行的每个元素用空格分隔,注意最后一个数的后面为换行符。
输入样例一:
5
输出样例一:
1 3 4 10 11
2 5 9 12 19
6 8 13 18 20
7 14 17 21 24
15 16 22 23 25
输入样例二:
10
输出样例二:
1 3 4 10 11 21 22 36 37 55
2 5 9 12 20 23 35 38 54 56
6 8 13 19 24 34 39 53 57 72
7 14 18 25 33 40 52 58 71 73
15 17 26 32 41 51 59 70 74 85
16 27 31 42 50 60 69 75 84 86
28 30 43 49 61 68 76 83 87 94
29 44 48 62 67 77 82 88 93 95
45 47 63 66 78 81 89 92 96 99
46 64 65 79 80 90 91 97 98 100
我们一开始肯定会先想去找矩阵变化规律,(1,1)-(2,1)-(1,2)...,这样排列下去发现有许多的转弯点,很难转换成一个模型,但算法的却是基于我们抽象出来的数学模型实现的,所以我们的第一步便是将问题进行转化。
通过观察,可以发现如果我们先忽略转弯点的话,那么此时的矩阵就是每一个斜线对应着一个连续的数字,拿5*5的举例
1 | 3 | 4 | 10 | 11 |
2 | 5 | 9 | 12 | 19 |
6 | 8 | 13 | 18 | 20 |
7 | 14 | 17 | 21 | 24 |
15 | 16 | 22 | 23 | 25 |
即(1),(2,3),(4,5,6),(7,8,9,10)...,同时这个序列的上下是有区别的,并且与奇偶相关,此时问题就明了了,先将矩阵分为左上部分和右下部分,再分奇偶来填充每一个序列就OK了,大家可以打一下,还是可以锻炼一点点码力的应该。AC代码如下。
#include <stdio.h>
int main(){
int n;
scanf("%d",&n);
int t = 1;
int map[n+1][n+1]; //c99以后的编译器才支持,不推荐这样写,这里为了方便这样用了
map[1][1] = 1;
for(int i = 1; i<=n; i++){ //先处理左上部分
if(i&1){
for(int j = 1, tmp = i; j<=n&&tmp>=1; j++,tmp--){
map[j][tmp] = t++;
}
}
else{
for(int j = 1, tmp1 = i; j<=n&&tmp1>=1; j++,tmp1--){
map[tmp1][j] = t++;
}
}
}
//通过对称性来反推右下部分
for(int i = n; i>=1; i--)
for(int j = n-i+2; j<=n; j++){
map[i][j] = n * n + 1 - map[n+1-i][n+1-j];
}
for(int i = 1; i<=n; i++)
for(int j = 1; j<=n; j++){
if(j == n) printf("%d\n",map[i][j]);
else printf("%d ",map[i][j]);
}
return 0;
}
因为还是新手,这段代码有些地方书写可能不够规范,多多包涵。
标签:10,int,样例,矩阵,++,二维,蛇形 From: https://blog.csdn.net/2403_86498269/article/details/144486340