• pat basic 1050 螺旋矩阵


     pat basic 1050

     螺旋矩阵

    本来没头绪,后来看了视频,然后有思路了;

    思路:总共有四个方向的移动,考虑上下左右边界~

    但是,还是不能全通过,害  * - *,搞了四五个小时,还是没找出来。

    代码如下:

    #include<iostream> 
    #include<cmath>
    #include<algorithm>
    using namespace std;
    int s[10000][10000]={0};
    int a[10010];
    int main(){
        int c,row,col;
        scanf("%d",&c) ;
        for( col=sqrt(c);col>0;col--){
            if(c%col==0){
                row=c/col;
                break;
            }
        } 
        int top=0,bottom=row-1,left=0,right=col-1;
        for(int i=0;i<c;i++)
        scanf("%d",&a[i]);
        int k=0;
        sort(a,a+c,greater<int>() );
        while(top<=bottom&&left<=right)    
        { for(int j=left;j<=right;j++)
            {  s[top][j]=a[k];
                k++;
            }
            top++;
        for(int i=top;i<=bottom;i++){
            s[i][right]=a[k];
            k++;
        }
        right--;
        for(int j=right;j>=left;j--){
            s[bottom][j]=a[k];
            k++;
        }
            bottom--;
        for(int i=bottom;i>=top;i--){
            s[i][left]=a[k];
            k++;
        }
        left++;
        }
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
            if(j!=col-1)
            printf("%d ",s[i][j]);
            else
            printf("%d
    ",s[i][j]);
            }
        }
            
        return 0;
    }
     

     我明白了!!!

    原来是我对于 while语句错误的认知 所导致的错误;

    正确的代码:

    #include<iostream> 
    
    #include<cmath>
    
    #include<algorithm>
    
    using namespace std;
    
    int s[10000][10000]={0};
    
    int a[10010];
    
    int main(){
    
        int c,row,col;
    
        scanf("%d",&c) ;
    
        for( col=sqrt(c);col>0;col--){
    
            if(c%col==0){
    
                row=c/col;
    
                break;
    
            }
    
        } 
    
        int top=0,bottom=row-1,left=0,right=col-1;
    
        for(int i=0;i<c;i++)
    
        scanf("%d",&a[i]);
    
        int k=0;
    
        sort(a,a+c,greater<int>() );
    
        while(top<=bottom&&left<=right)    
    
        { for(int j=left;j<=right;j++)
    
            {  s[top][j]=a[k];
    
                k++;
    
            }
    
            top++;
        if(top>bottom) break;    //一直以为这一句没必要,以为while开头就已经判断好了,后来才知道,while循环 是先执行完所有语句,然后再判断一次的
        for(int i=top;i<=bottom;i++){
    
            s[i][right]=a[k];
    
            k++;
    
        }
    
        right--;
        if(left>right)
        break;
        for(int j=right;j>=left;j--){
    
            s[bottom][j]=a[k];
    
            k++;
    
        }
    
            bottom--;
            if(bottom<top) break;
    
        for(int i=bottom;i>=top;i--){
    
            s[i][left]=a[k];
    
            k++;
    
        }
    
        left++;
    if(left>right) break;
        }
    
        for(int i=0;i<row;i++){
    
            for(int j=0;j<col;j++){
    
            if(j!=col-1)
    
            printf("%d ",s[i][j]);
    
            else
    
            printf("%d
    ",s[i][j]);
    
            }
    
        }
    
            
    
        return 0;
    
    }

    无聊就学习 反正没事干
  • 相关阅读:
    Surface Mount Package Details
    Boost Converter
    IPC low/medium/high density 什么意思?
    SMT Surface Mount Technology footprint references
    Time Step Too Small in Multisim
    mOByDiC E90C2600 EOBD/OBDII to RS232 gateway
    STN1110 Multiprotocol OBD to UART Interpreter
    STN1170 Multiprotocol OBD to UART Interpreter
    BR16F84 OBD II Interface Chip For PWM, VPW, and ISO 9141-2 Vehicles
    ELM327 OBD to RS232 Interpreters
  • 原文地址:https://www.cnblogs.com/miao-xixixi/p/12492638.html
Copyright © 2020-2023  润新知