题目传送门
怎么说呢,如果你也是上下左右输出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;
}