分治法-简单矩阵
输出如下所示N*N(1<=N<=10)的数学方阵
输入:6
输出:
1 20 19 18 17 16
2 21 32 31 30 15
3 22 33 36 29 14
4 23 34 35 28 13
5 24 25 26 27 12
6 7 8 9 10 11
思路:利用分治法,逐层填数,先填最外层:
1 20 19 18 17 16
2 15
3 14
4 13
5 12
6 7 8 9 10 11
实现代码:
#include<stdio.h>
int data[1000][1000];
void Full(int number,int begin,int size)
{ //从number开始填写size方阵,左上角的下标为(begin,begin)
int i,j,k;
if(size==0)
return;
if(size==1)
{
data[begin][begin];
return;
}
i=begin;j=begin;
for(k=0;k<size-1;k++)//填写左侧的数字
{
data[i][j]=number;
number++;i++;
}
for(k=0;k<size-1;k++)//填写下侧的数字
{
data[i][j]=number;
number++;j++;
}
for(k=0;k<size-1;k++)//填写右侧的数字
{
data[i][j]=number;
number++;i--;
}
for(k=0;k<size-1;k++)//填写上侧的数字
{
data[i][j]=number;
number++;j--;
}
Full(number,begin+1,size-2);//递归求解,左上角下标为begin+1
//下一次每一行填写的数字个数是上一次的数字个数减去2;
}
int main()
{
int i,j,n,m;
scanf("%d",&n);
Full(1,0,n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%4d",data[i][j]);
puts("");
}
return 0;
}
最后更新:2017-04-03 12:55:52