PAT乙级1050-----螺旋矩阵 (25分)
1050 螺旋矩阵 (25分)
输入样例:
12
37 76 20 98 76 42 53 95 60 81 58 93
输出样例:
98 95 93 42 37 81 53 20 76 58 60 76
思路:
1.将输入的数字升序排序
2.设置一个二维数组S,一个上下区间[r_up,r_down],一个左右区间[c_left,c_right],以及行列标志flag=1(flag=1表示此次操作的是行),方向标志dir(dir=0,1,2,3分别代表方向向右下左上)
3.每往右走一次r_up++,左走一次r_down--,下走一次c_right--,上走一次c_left++,然后设置i和j,移动i或j将有序数字加入S[i][j]即可
首次通过代码:
1 #include<stdio.h> 2 #include<math.h> 3 void sort(int a[],int b){ 4 for(int i=b;i>0;i--){ 5 if(a[i]>a[i-1]){ 6 int swap; 7 swap=a[i]; 8 a[i]=a[i-1]; 9 a[i-1]=swap; 10 } 11 } 12 } 13 void func(int a[],int b){ 14 int x=sqrt((double)b); 15 int y=sqrt((double)b); 16 while(x*y!=b){ 17 if(x*y<b) y++; 18 else x--; 19 } 20 a[0]=x;a[1]=y; 21 } 22 int main(){ 23 int sum; 24 int a[10004]; 25 int b[2]; 26 int matrix[10000][100]; 27 scanf("%d",&sum); 28 for(int i=0;i<sum;i++){ 29 scanf("%d",&a[i]); 30 sort(a,i); 31 } 32 func(b,sum); 33 int r_up=1,r_down=b[1]; 34 int c_left=1,c_right=b[0]; 35 int flag=1; 36 int dir=0;//方向 0---右 1---下 2---左 3---上 37 int num=0; 38 int i=1,j=1; 39 while(1){ 40 int i,j; 41 if(flag){ 42 if(dir==0) { 43 44 i=r_up;j=c_left; 45 while(j<=c_right){ 46 matrix[i][j]=a[num++]; 47 j++; 48 } 49 r_up++; 50 } 51 else if(dir==2){ 52 i=r_down;j=c_right; 53 while(j>=c_left){ 54 matrix[i][j]=a[num++]; 55 j--; 56 } 57 r_down--; 58 } 59 flag=0; 60 dir=(dir+1)%4; 61 } 62 else{ 63 if(dir==1){ 64 i=r_up;j=c_right; 65 while(i<=r_down){ 66 matrix[i][j]=a[num++]; 67 i++; 68 } 69 c_right--; 70 } 71 else if(dir==3){ 72 i=r_down;j=c_left; 73 while(i>=r_up){ 74 matrix[i][j]=a[num++]; 75 i--; 76 } 77 c_left++; 78 } 79 flag=1; 80 dir=(dir+1)%4; 81 } 82 if(r_down<r_up||c_left>c_right) break; 83 } 84 for(int i=1;i<=b[1];i++){ 85 for(int j=1;j<=b[0];j++){ 86 printf("%d",matrix[i][j]); 87 if(j!=b[0]) printf(" "); 88 } 89 if(i!=b[1]) printf("\n"); 90 } 91 return 0; 92 }