pat乙级1050螺旋矩阵测试点2

题目传送门
怎么说呢,如果你也是上下左右输出n-1/m-1个数,不妨试试下面这组测试数据
9 1 2 3 4 5 6 7 8 9
这一组测试数据会输出
9 8 7
2 0 6
3 4 5
本来这个‘0’应该输出为‘1’
因为在这样的情况下
向右输的代码为 for(j=i;j<=n-i&&k<=N;j++)
此时一定要满足n>=2i才能输入 这就造成了在n=3 i=2的情况下 这个for循环走不了
然后我就改了一下输出规则
向右输 n个数 向下输n-2个数
然后问题得到了解决
做题还是要多考虑极端情况

#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
using namespace std;
//9
//1 2 3 4 5 6 7 8 9
int main(){
    int N,i,j;
    int a[100010];
    int m,n;
    while(~scanf("%d",&N)){
        int flag=0;
        for(i=1;i<=N;i++){
            scanf("%d",&a[i]);
        }
        sort(a+1,a+N+1,greater<int>());
        for(i=2;i*i<=N;i++){
            if(N%i==0){
                flag=1;
                m=N/i;
            }
        }
        if(flag==0){
            for(i=1;i<=N;i++){
            printf("%d\n",a[i]);
            }
        }
        else{
            n=N/m;
            int arr[m+10][n+10];
            int cir=(m+1)/2;
            int k=1;
            for(i=1;i<=cir;i++){            
                for(j=i;j<=n-i+1&&k<=N;j++){//向右
                    arr[i][j]=a[k++];                 
                }

                for(j=i+1;j<=m-i&&k<=N;j++){//向下
                    arr[j][n-i+1]=a[k++];
                }

                for(j=n-i+1;j>=i+1&&k<=N;j--){//向左
                    arr[m-i+1][j]=a[k++];                   
                }
                for(j=m-i+1;j>=i+1&&k<=N;j--){//向上
                    arr[j][i]=a[k++];
            }
            for(i=1;i<=m;i++){
                for(j=1;j<=n;j++){
                    if(j!=1)
                        printf(" ");
                    printf("%d",arr[i][j]);
                }
                printf("\n");
            }
        }

    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值