题解 | #蛇形矩阵#
蛇形矩阵
https://www.nowcoder.com/practice/649b210ef44446e3b1cd1be6fa4cab5e
解题思路:
建议一步一步的来
1.先用两个循环打出三角形
for(i=0;i<N;i++) { for(j=0;j<M;j++) { printf("1"); if(j<M-1)//判断是不是每一行的最后一个,如果不是就打印空格 { printf(" "); } } printf("\n"); M--; } |
2.然后设置一个二维数组分别存一会儿要加的数据
找规律,x方向(横着的方向)1 3 6 10 15 .... 前一位得到后一位是分别加2 3 4 5....
第二行2 5 9 14....前一位得到后一位是分别加3 4 5....剩下的以此类推
y方向(竖着的方向)1 2 4 7....前一位得到后一位分别是加1 2 3 4....
所以二维数组一个存x方向需要加的数字,一个存y方向需要加的数字
用一个for循环就可以生成
for(i=0;i<N-1;i++)//N为接受到的要打印几行 { lib[i][0]=i+2;//x方向加的数字f lib[i][1]=i+1;//y方向加的数字 // printf("%d,%d\n",lib[i][0],lib[i][1]); } |
3.最后找规律再把1.2步骤结合
规律每一行第一位相差前一行最后一位减去这一行加数字之和再加y方向的规律
如
1 3 6 10 15
2 5 9 14
4 8 13
2=15-(2+3+4+5)+1
4=14-(3+4+5)+2
#include <stdio.h> int main() { int N=0,i=0,M=1,sum=0,temp=1,j=0; int num=2; int lib[100][2]={'\0'}; scanf("%d",&N); // printf("%d",M); M=N; for(i=0;i<N-1;i++) { lib[i][0]=i+2;//x方向加的数字 lib[i][1]=i+1;//y方向加的数字 // printf("%d,%d\n",lib[i][0],lib[i][1]); } for(i=0;i<N;i++) { for(j=0;j<M;j++) { printf("%d",temp); if(j<M-1) { printf(" "); temp=temp+lib[j+i][0]; sum+=lib[j+i][0]; num++; } } printf("\n"); temp=temp-sum; sum=0; temp=temp+lib[i][1]; M--; } return 0; }