數字方陣的旋轉填充(遞迴方法)
阿新 • • 發佈:2019-02-20
數字方陣的旋轉填充
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課件