1. 程式人生 > >數字方陣的旋轉填充(遞迴方法)

數字方陣的旋轉填充(遞迴方法)

數字方陣的旋轉填充

void FillMatrix(int matrix[N][N],int size,int num,int offset)
{
    //matrix為總矩陣,size為剩餘矩陣的大小,num為要填的第一個數,offset為剩餘矩陣在總矩陣中的位置
    //遞迴終止條件
    if(size==0)
        return;
    //遞迴終止條件
    if(size==1)
    {
        matrix[offset][offset]=num;
        return;
    }
    //先填充外圍
    int i;
    for(i=0;i<size-1;i++)
    {
        matrix[offset+i][offset]=num+i;
        matrix[offset+size-1][offset+i]=num+(size-1)+i;
        matrix[offset+size-1-i][offset+size-1]=num+2*(size-1)+i;
        matrix[offset][offset+size-1-i]=num+3*(size-1)+i;
    }
    //再遞迴填充核心(小了一圈的子矩陣)
    FillMatrix(matrix,size-2,num+4*(size-1),offset+1);
}

其原理如圖所示一圈圈的填充,


測試程式碼:

int main()
{
   int Matrix[5][5];
   FillMatrix(Matrix,5,1,0);
   int i,j;
   for(i=0;i<5;i++)
   {
       for(j=0;j<5;j++)
       {
           cout<<setw(4)<<Matrix[i][j]<<" ";
       }
       cout<<endl;
   }
    return 0;
}

測試結果:


示例2

給定一個nxn(n<10)的方陣,請輸出左上角開始逆時針從大到小填充方陣的結果。


輸入方陣的大小n,輸出方陣填充結果,每個數字均佔兩位並右對齊,以一個空格隔開。

#include<iostream>
#include<iomanip>
using namespace std;
const int N=10;
void FillMatrix(int matrix[N][N],int size,int num,int offset)
{
    //matrix為總矩陣,size為剩餘矩陣的大小,num為要填的第一個數,offset為剩餘矩陣在總矩陣中的位置
    //遞迴終止條件
    if(size==0)
        return;
    //遞迴終止條件
    if(size==1)
    {
        matrix[offset][offset]=num;
        return;
    }
    //先填充外圍
    int i;
    for(i=0;i<size-1;i++)
    {
        matrix[offset+i][offset]=num-i;
        matrix[offset+size-1][offset+i]=num-(size-1)-i;
        matrix[offset+size-1-i][offset+size-1]=num-2*(size-1)-i;
        matrix[offset][offset+size-1-i]=num-3*(size-1)-i;
    }
    //再遞迴填充核心(小了一圈的子矩陣)
    FillMatrix(matrix,size-2,num-4*(size-1),offset+1);
}

int main()
{
   int Matrix[N][N];
   int n;
   cin>>n;
   FillMatrix(Matrix,n,n*n,0);
   int i,j;
   for(i=0;i<n;i++)
   {
       for(j=0;j<n;j++)
       {
           cout<<setw(2)<<Matrix[i][j]<<" ";
       }
       cout<<endl;
   }
    return 0;
}

執行結果:


來自清華大學MOOC課件