1. 程式人生 > >資料結構——遞迴求數字旋轉方陣

資料結構——遞迴求數字旋轉方陣

【數字旋轉方陣問題】
問題描述:輸出下圖所示N×N(N≥1)的數字旋轉方陣。要求:採用遞迴法實現。
在這裡插入圖片描述
提示:注意觀察A、B、C、D四個區域。
void FillInNum(int number, int begin, int MatrixSize)
{ // 從數字number開始填寫, 例如從1開始填寫;
// MatrixSize為N維方陣,第一個填充的左上角的下標為(begin, begin)

/網上有些程式碼有很多很高階的技巧,但我覺得我這篇應該算更好理解的/

#include<stdio.h>
int a[37][37],i,j,k,n;

void FillInNum
(int number, int begin, int MatrixSize) { i=j=begin; if(MatrixSize==0) return; if(MatrixSize==1) { a[begin][begin]=number; return; } for(k=1;k< MatrixSize;k++,i++) a[i][j]=number++; for(k=1;k< MatrixSize;k++,j++) a[i][j]=number++; for(k=1;k< MatrixSize;k++,i--) a[i][j]=
number++; for(k=1;k< MatrixSize;k++,j--) a[i][j]=number++; return FillInNum(number,++begin,MatrixSize-2); } void print() { for(i=1; i<=n; i++) { for(j=1; j<=n; j++) printf("%4d",a[i][j]); printf("\n"); } } int main() { printf("請輸入旋轉方陣的邊長(1到36之間):"); scanf("%d",&n); FillInNum
(1,1,n); print(); }

優化後的正確的主函式程式碼如下:

int main()
{
	printf("請輸入開始填寫的數字:");
	scanf("%d",&num);
	printf("請輸入第一個填充的左上角下標:");
	scanf("%d",&beg);
	printf("請輸入旋轉陣列的邊長(1到36之間):");
	scanf("%d",&n);	
	FillInNum(num,beg,n-beg+1);
	print();
}