1050. 螺旋矩陣


本題要求將給定的N個正整數按非遞增的順序,填入“螺旋矩陣”。所謂“螺旋矩陣”,是指從左上角第1個格子開始,按順時針螺旋方向填充。要求矩陣的規模為m行n列,滿足條件:m*n等於N;m>=n;且m-n取所有可能值中的最小值。

輸入格式:

輸入在第1行中給出一個正整數N,第2行給出N個待填充的正整數。所有數字不超過104,相鄰數字以空格分隔。

輸出格式:

輸出螺旋矩陣。每行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

解題思路:
先利用 qsort 來進行降序排列。再用 sqrt 等取得行數和列數。這里要注意 3 個,5 個,8 個等的情況。

由於輸入的數都是正數,因此先將二維數組均初始化為 0,通過這樣就可以判斷是否已經寫入數據(即是否已訪問過),如果訪問過(即其值非 0),則換下一個方向進行順時針賦值。

按順時針寫入到二維數組中。先走到最右,再向下,然后向左,最后向上。這是順時針旋轉一次的過程。循環結束的出口是訪問到了已排序好的數組的最后一個值( count == N 時)。

最后輸出二維數組即可。

基本上就是原樣模擬了旋轉的過程。代碼 90 多行,看起來有點多。但實際上在四個方向上的代碼非常相似。編寫起來也並不麻煩。編寫成函數有點小麻煩,而且這樣看起來也更直觀,所以就這樣咯。

解題代碼:

#include<stdio.h> 
#include<stdlib.h>
#include<math.h> 

int compare(const void *p, const void *q);

int main() 
{	 
	int N;
	scanf("%d", &N);
	int a[N];
	for (int i=0; i<N; i++) {
		scanf("%d", &a[i]);
	}
	qsort(a, N, sizeof(int), compare);
 	int row = ceil(sqrt(N));
 	int col = sqrt(N);
 	while (row * col != N) {
	 	if (row * col < N) {
	 		row ++;
	 	} else if (row * col > N){
	 		col --;
	 	}
 	} // 計算行數與列數 
	
	int b[row][col];
	for (int i=0; i<row; i++) {
		for (int j=0; j<col; j++) {
			b[i][j] = 0;
		}
	} // 二維數組初始化 
	
	int i = 0, j = 0;
	int count = 0;
	while (count != N) {
		for ( ; j<col; j++) {
			if (!b[i][j]) {
				b[i][j] = a[count++];
			} else {
				break;
			}
		} // 向右走 
		j--; // 退出不滿足的列 
		i++; // 進入下一行 
		for ( ; i<row; i++) {
			if (!b[i][j]) {
				b[i][j] = a[count++];
			} else {
				break;
			}
		} // 向下走 
		i--; // 退出不滿足的行 
		j--; // 進入下一列 (向左) 
		for ( ; j>=0; j--) {
			if (!b[i][j]) {
				b[i][j] = a[count++];
			} else {
				break;
			}
		} // 向左走 
		i--; // 進入下一行 (向上) 
		j++; // 退出不滿足的列 
		for ( ; i>=0; i--) {
			if (!b[i][j]) {
				b[i][j] = a[count++];
			} else {
				break;
			}
		} // 向上走 
		i++; // 退出不滿足的行(下一步向右) 
		j++; // 進入下一列(向右)			 					
	}
	
	for (int i=0; i<row; i++) {
		for (int j=0; j<col; j++) {
			printf ("%d", b[i][j]);
			if (j < col-1) {
				printf (" ");
			}
		}
		printf ("\n");
	}	
	
	return 0;
} 

int compare(const void *p, const void *q) {
	int x = *(int *)p;
	int y = *(int *)q;
	if (x > y) {
		return -1;
	} else if (x < y) {
		return 1;
	}
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM