79 阵列

79 阵列

作者: 孙辞海 时间限制: 10S章节: 二维数组

问题描述 :

明明在上学的时候,参加数学兴趣班。在班上,老师介绍了一种非常有趣的阵列。

该阵列由n个正整数构成,阵列中的数字从1开始递增,数字的排序规则是从1开始由中间逆时针向外转出,2出现在1的下面,然后直至输出n为止。

例如当n=5的时候,阵列如下:

5

1 4

2 3

当n=9时,阵列如下:

7 6 5

8 1 4

9 2 3

当n=10时,阵列如下:

7 6 5

8 1 4

9 2 3

10

明明回家后想自己动手构造这样的阵列。他从n=1开始构造,但是他发现当n越来越大时,阵列的复杂性就越高,然后构造出来的阵列就越容易出错。为了降低构造阵列的出错率,提高构造速度,明明就求助于你,请你帮他写一个程序,来构造这样的阵列。

明明的问题可以归结为:给你一个正整数n,请你按题目描述中所述的方法,构造出阵列。

输入说明 :

你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅有一个正整数n(1≤n≤99),即所要构造的阵列的大小。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明 :

对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个大小为n的阵列,阵列中的数字用一个空格隔开,具体形式请参考输出样例: 当n为个位数时,输出的每个数占1位,当n为两位数时,两位数所在的列输出的每个数占2位(不足2位的左边补空格)。 每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果之后没有任何空行。 注:通常,显示屏为标准输出设备。

输入范例 :

5
45
10

输出范例 :

5
1 4
2 3

43 42 41 40 39 38 37
44 21 20 19 18 17 36
45 22 7 6 5 16 35
23 8 1 4 15 34
24 9 2 3 14 33
25 10 11 12 13 32
26 27 28 29 30 31

7 6 5
8 1 4
9 2 3
10
从上到下 从左到右 从下到上 从右到左输出 相应更新矩阵位置
但我不知道为什么我的格式不对 有大佬解答吗?

#include<stdio.h>
#include<string.h>
int main()
{
	int n;
	int a[11][11],d=1;
	while(scanf("%d",&n)!=EOF)
	{
		memset(a,0,sizeof(a));
		int count=0,c=0,maxi=5,mini=5,minj=5,maxj=5;
		while(count!=n)
		{
			for(int i=5-c;i<=6+c;i++)
			{
				if(count==n)
				break;
				if(i>maxi)
				maxi=i;//更新最大i 
				if(5-c<minj)
				minj=5-c;//更新最小i 
				if(i)
				a[i][5-c]=++count;//向下走	
			}  
			for(int j=6-c;j<=6+c;j++)
			{
				if(count==n)
				break;
				if(j>maxj)
				maxj=j;//更新最大j 
				a[6+c][j]=++count;//向右走 
			}   
			for(int i=5+c;i>=4-c;i--)
			{
				if(count==n)
				break;
				if(i<mini)
				mini=i;//更新最小i 
				a[i][6+c]=++count;//向上走 
				
			}
			for(int j=5+c;j>=5-c;j--)
			{
				if(count==n)
				break;
				a[4-c][j]=++count;//向左走 
			} 
			c++;  
		}
		if(d++!=1) printf("\n");
		if(n<10)
		{
			for(int i=mini;i<=maxi;i++)
		{
			for(int j=minj;j<=maxj;j++)
		    {
		    	if(j!=minj)
		    	printf(" ");
		    	if(a[i][j]==0)
		    	printf(" ");
		    	else
		    	printf("%d",a[i][j]);	
		    }
		    printf("\n");
		}
		}
		else
		{
			for(int i=mini;i<=maxi;i++)
		{
			for(int j=minj;j<=maxj;j++)
		    {
		    	if(j!=minj)
		    	printf(" ");
		    	if(a[i][j]==0)
		    	printf("  ");
		    	if(a[i][j]<10&&a[i][j]>0)
		    	printf("%2d",a[i][j]);
		    	if(a[i][j]>=10)
		    	printf("%d",a[i][j]);	
		    }
		    printf("\n");
		}
		}
		
		
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值