東華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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章