資料結構——遞迴求數字旋轉方陣
阿新 • • 發佈:2018-12-03
【數字旋轉方陣問題】
問題描述:輸出下圖所示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();
}