螺旋矩阵
|
||||||
Description | ||||||
对于给定的一个数n,要你打印n*n的螺旋矩阵。 比如n=3时,输出: 1 2 3 |
||||||
Input | ||||||
多组测试数据,每个测试数据包含一个整数n(1<=n<=32) | ||||||
Output | ||||||
对于每组测试数据,输出一个n*n的螺旋矩阵,定义在题目描述里。 在一组测试数据中,每个数占的字符宽度是该组数据中最大的数位数加1,比如3*3的螺旋矩阵,最大值是9,那么每个数就要占2个字符宽度。 两组测试数据之间用一个空行隔开。 |
||||||
Sample Input | ||||||
1 2 3 |
||||||
Sample Output | ||||||
11 24 31 2 38 9 47 6 5 |
主要判断下n是偶数还是奇数。。然后弄几个for循环,找到合适的时候跳出即可。
这题最大的收获是知道了怎么控制输出的长度:::
printf("%*d",sum2+1,re[i][j]);///sum2是输出的长度
注意啊;;题目说两组测试数据之间用一个空行隔开。千万别忘了。
上代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int re[100][100];
int ls,sum,cs;
int h,l;
int zs;
int main()
{int n;zs=0;while(~scanf("%d",&n)){if(zs!=0){printf("\n");}zs++;memset(re,0,sizeof(re));if(n==1)///单独判断下1{printf("%2d\n",1);continue;}sum=n*n;///最大的数是n*nint sum2=0;int ls2=sum;while(ls2){ls2/=10;sum2++;///计算位数}ls=1;if(n%2==0){cs=n/2;}else{cs=(n+1)/2-1;}h=1;l=n;for(int s=0; s<cs; s++)///控制层数{for(int i=h; i<=l; i++)///四个循环对应每一层的四个边{re[h][i]=ls;ls++;}for(int i=h+1; i<=l; i++){re[i][l]=ls;ls++;}for(int i=l-1; i>=h; i--){re[l][i]=ls;ls++;}for(int i=l-1; i>=h+1; i--){re[i][h]=ls;ls++;}l--;///进入下一层循环h++;if(n%2!=0){if(ls==sum)///奇数时跳出时机{re[cs+1][cs+1]=sum;break;}}else{if(ls==sum+1)///偶数时跳出时机{break;}}}for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){printf("%*d",sum2+1,re[i][j]);///sum2是输出的长度}printf("\n");}}return 0;
}//1 2 3 4
//12 13 14 5
//11 16 15 6
//10 9 8 7
//
//1 2 3 4 5
//16 17 18 19 6
//15 24 25 20 7
//14 23 22 21 8
//13 12 11 10 9
// 1 2 3
// 8 9 4
// 7 6 5