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;

}

无聊就学习 反正没事干
原文地址:https://www.cnblogs.com/miao-xixixi/p/12492638.html