PTA 1050 螺旋矩阵 (25 分)

1050 螺旋矩阵 (25 分)

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。

输入格式:

输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 10^​4 ,相邻数字以空格分隔。

输出格式:

输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。

输入样例:

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向下走到头3向左走到头4向上走到头,要注意设置上下左右行数作为限制。

#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
	return *(int *)a<*(int*)b ? 1:-1;
}
int main()
{
 int n,x,y,x1,y1;
 scanf("%d",&n);
 int num[n],i,j;
 for(i=n;i>=1;i--)  //找到行数,和列数; 
 {
 	if(n%i==0)
 	{
 		x1=i;
 		y1=n/i;
 		if(x1>=y1) 
 		{
 		  x=x1;
		   y=y1;	
		}
		 else  break;
	 }
 }
 x1=x;
 y1=y;
 int num1[x][y];
 for(i=0;i<n;i++)
 {
 	scanf("%d",&num[i]);
  } 
qsort(num,n,sizeof(int),cmp);
  i=0;j=0;
  int tim=n;
  int t=0;
  while(tim>0)  //爱用碰壁法; 
  {int t1=0;
  	for(i=j,t1=0;t1<y;t1++,i++)
  	{
  		num1[j][i]=num[t++];
  		tim--;
  		if(tim==0) break;
	  }
	  if(tim==0) break;
	  x--;
	  i--;
	  for(j=j+1,t1=0;t1<x;t1++,j++)
	  {
	  	num1[j][i]=num[t++];
	  	tim--;
	  	if(tim==0)  break;
	  }
	  if(tim==0) break;
	  y--;
	  j--;
	  for(i=i-1,t1=0;t1<y;t1++,i--)
	  {
	  	num1[j][i]=num[t++];
	  	tim--;
	  	if(tim==0)  break;
	  }
	  i++;
	  if(tim==0) break;
	  x--;
	  for(j=j-1,t1=0;t1<x;t1++,j--)
	  {
	  	num1[j][i]=num[t++];
	  	tim--;
	  	if(tim==0) break;
	  }
	  j++;
	  if(tim==0) break;
	y--;
  }
  for(i=0;i<x1;i++)
  {
  	for(j=0;j<y1;j++)
  	{
  	if(j==0)
  	{
  		printf("%d",num1[i][j]);
	  }
	  else printf(" %d",num1[i][j]);
	  }
	  printf("\n");
  }
	return 0;
 } 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一蓑烟雨荏平生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值