1 2 3 4

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 }
View Code

 

posted @ 2020-02-29 12:54  Qianren  阅读(148)  评论(0编辑  收藏  举报