ACM_三角形蛇形矩阵
三角形蛇形矩阵
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
小铠觉得各类题型是要温故而知新的,所以他叫小发出一道类似做过的题。其实,一开始小发是拒绝的,但后来想了想,出些能坑别人的题也是人生的一大乐趣,何乐而不为。小发回顾了做过的题,灵机一闪,出了道三角形的蛇形矩阵。
Input:
输入包含多组测试数据,首先输入n(1<n<=20),代表n*n的三角形矩阵。
Output:
当n为奇数时,从1开始顺时针方向填入递增数据,并且在左下角输出三角形斜边的值之和m;当n为偶数时,从1开始逆时针方向填入递增数据,并且在右上角输出三角形斜边的值之和m。(注意数据间的空格和m的位置) 注意最后一个数字依然有空格,规则是数字加空格位数为4位,具体参考样例。
Sample Input:
4 5
Sample Output:
1 26 2 8 3 9 10 4 5 6 7 1 2 3 4 5 10 11 12 6 15 13 7 14 8 49 9
解题思路:水题!一直卡PE,最后发现原来当n为偶数时,除了右上角那个值后面不能有空格之外,其它情况每行输出的最后一个数字+空格共占4位,即最后一个数字的位数如果小于4,则后面需带(4-最后一个数字的位数)个空格。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 int n,m,i,j,border,a[25][25]; 5 while(~scanf("%d",&n)){ 6 memset(a,0,sizeof(a));m=1;//a数组清0 7 if(n%2){//奇数 8 for(int k=1;k<=(n+1)/2;++k){ 9 i=j=k;border=n-k+1; 10 while(j<=border){a[i][j]=m++;j++;} 11 i++;j--; 12 while(i<=border){a[i][j]=m++;i++;} 13 } 14 for(int k=1;k<=n;++k)a[n][1]+=a[k][k]; 15 for(int k=1;k<=n;k++){ 16 for(int g=1;g<=n;++g){ 17 if(a[k][g]==0)printf(" "); 18 else printf("%-4d",a[k][g]); 19 } 20 printf("\n"); 21 } 22 } 23 else{//偶数 24 for(int k=1;k<=n/2;++k){ 25 i=j=k;border=n-k+1; 26 while(i<=border){a[i][j]=m++;i++;} 27 i--;j++; 28 while(j<=border){a[i][j]=m++;j++;} 29 } 30 for(int k=1;k<=n;++k)a[1][n]+=a[k][k]; 31 for(int g=1;g<=n;++g){ 32 if(a[1][g]==0)printf(" "); 33 else{ 34 if(g!=n)printf("%-4d",a[1][g]); 35 else printf("%d\n",a[1][g]);//n为偶数的时候右上角这个值后面不能有空格 36 } 37 } 38 for(int k=2;k<=n;k++){ 39 for(int g=1;g<=k;++g) 40 printf("%-4d",a[k][g]);//其余每行最后一个数字+空格共占4位 41 printf("\n"); 42 } 43 } 44 } 45 return 0; 46 }