东华oj-进阶题第61题-螺旋方阵

在这里插入图片描述

61 螺旋方阵

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

问题描述 :

明明在上学的时候,参加数学兴趣班。在班上,老师介绍了一种非常有趣的方阵,称之为螺旋方阵。该方阵一共由n×n个正整数构成(我们称之为n阶螺旋方阵),即共有n行n列。

方阵中的数字从1开始递增,数字的排序规则是从左上角出发由1开始排序,并按顺时针方向旋进,即先排最外面的一圈,然后排里面的一圈,以此类推,直到排到最后一个数为止。

例如一个4阶的螺旋方阵,一共有4×4=16个正整数构成,数字从1递增到16,最后排出来的方阵如下:

 1  2  3  4

12 13 14  5

11 16 15  6

10  9  8  7

明明回家后想自己动手构造这样的螺旋方阵。他从n=1开始构造,但是他发现当n越来越大时,螺旋方阵的复杂性就越高,然后构造出来的方阵就越容易出错。为了降低构造方阵的出错率,提高构造速度,明明就求助于你,请你帮他写一个程序,来构造螺旋方阵。
明明的问题可以归结为:给你一个正整数n,请你按题目描述中所述的方法,构造出n阶的螺旋方阵。 输入说明 :

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

对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个n阶的螺旋方阵,方阵中的数字用一个空格隔开,具体形式请参考输出样例。每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果之后没有空行。
注:通常,显示屏为标准输出设备。 输入范例 :

9
4

输出范例 :

1 2 3 4 5 6 7 8 9
32 33 34 35 36 37 38 39 10
31 56 57 58 59 60 61 40 11
30 55 72 73 74 75 62 41 12
29 54 71 80 81 76 63 42 13
28 53 70 79 78 77 64 43 14
27 52 69 68 67 66 65 44 15
26 51 50 49 48 47 46 45 16
25 24 23 22 21 20 19 18 17
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

代码:

/*
	T61 螺旋方阵 
	算法概述:一圈一圈打印,每一圈分上右下左四个方向分别打印 
*/ 

#include<stdio.h>
#include<string.h>
#define MAX_SIZE 11

int main() {
	int n = 0;
	int count = 0;
	int i = 0, j = 0;
	int layer = 0;// 表示当前的打印的层数 
	int matrix[MAX_SIZE][MAX_SIZE];
	
	while (scanf("%d", &n) != EOF) {
		layer = 1; 
		memset(matrix, 0, sizeof(matrix));
		
		count++;
		if (count > 1)
			printf("\n");

		i = 1;
		while (i <= n * n) {
			for (j = layer; j <= n - layer + 1; j++) {// 上 
				matrix[layer][j] = i++;
			}
			for (j = layer + 1; j <= n - layer; j++) {// 右 
				matrix[j][n - layer + 1] = i++;
			}	
			for (j = n - layer + 1; j >= layer; j--) {// 下 
				matrix[n - layer + 1][j] = i++;
			}
			for (j = n - layer; j >= layer + 1; j--) {// 左 
				matrix[j][layer] = i++;
			}
			
			layer++;
		}
		
		for (i = 1; i <= n; i++) {
			for (j = 1; j <= n; j++) {
				if (j == 1) 
					printf("%d", matrix[i][j]);
				else 
					printf("% d", matrix[i][j]);
			} 
			printf("\n");
		} 
	}
	
	return 0;
} 

提交之后是这样的
在这里插入图片描述
在这里插入图片描述
明明一模一样耶……
空格、换行啥的都注意了,不然应该是全错才对
在这里插入图片描述
希望有大佬能发现我的错误之处

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

找到错误的地方了,当n是奇数的时候且在最后一层的时候只有一个数,但是此时有两个循环都会执行,后面的循环就会把前面的结果覆盖掉,所以有错误
在这里插入图片描述
改了下就AC了:

/*
	T61 螺旋方阵 
	算法概述:一圈一圈打印,每一圈分上右下左四个方向分别打印 
*/ 

#include<stdio.h>
#include<string.h>
#define MAX_SIZE 11

int main() {// 注意!!!奇数答案有问题  
	int n = 0;
	int count = 0;
	int i = 0, j = 0;
	int layer = 0;// 表示当前的打印的层数 
	int matrix[MAX_SIZE][MAX_SIZE];// 存放螺旋方阵 
	
	while (scanf("%d", &n) != EOF) {
		layer = 1; 
		memset(matrix, 0, sizeof(matrix));
		
		count++;
		if (count > 1)
			printf("\n");

		i = 1;
		while (i <= n * n) {
			for (j = layer; j <= n - layer + 1; j++) {// 上 
				matrix[layer][j] = i++;
			}
			if (n % 2 == 1 && layer == n / 2 + 1)// 方阵阶数为奇数,且为最后一圈,则只有一个数,特殊处理 
				break; 
			for (j = layer + 1; j <= n - layer; j++) {// 右 
				matrix[j][n - layer + 1] = i++;
			}	
			for (j = n - layer + 1; j >= layer; j--) {// 下 
				matrix[n - layer + 1][j] = i++;
			}
			for (j = n - layer; j >= layer + 1; j--) {// 左 
				matrix[j][layer] = i++;
			}
			
			layer++;
		}
		
		for (i = 1; i <= n; i++) {
			for (j = 1; j <= n; j++) {
				if (j == 1) 
					printf("%d", matrix[i][j]);
				else 
					printf("% d", matrix[i][j]);
			} 
			printf("\n");
		} 
	}
	
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章