您的位置:首页 > 其它

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

2015-06-16 19:27 302 查看
数字方阵的旋转填充

void FillMatrix(int matrix

,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

,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

;
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课件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: