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

数字方阵的旋转填充

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


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值