• 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("
    ");
    90       }
    91     return 0;
    92 }
    View Code
  • 相关阅读:
    一元多项式的运算
    单链表逆转
    字符串函数
    历届试题 错误票据
    不用循环,不用递归,输出1~1000的整数
    sql三维数据
    SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问 (也就是跨数据库访问出错)
    由于服务器意外的断电,导致SQL SERVER服务器上数据库出现“置疑”而无法使用,
    关于delphi7的四舍五入
    关于delphi exit 继承
  • 原文地址:https://www.cnblogs.com/a982961222/p/12382435.html
Copyright © 2020-2023  润新知