数字方阵的旋转填充(递归方法)

来源:互联网 发布:淘宝客服分流顺序 编辑:程序博客网 时间:2024/04/29 15:19

数字方阵的旋转填充

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课件


0 0
原创粉丝点击