http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11081&courseid=81

一个递归题,找出规律,递归形成方阵,求出每个元素值

View Code
#include<cstdio>
#include<iostream>
using namespace std;

#define N 102

int i,j,x,y,num,s[N][N];

void output(int i,int j,int n)
{
if(n==1)
{
s[i][j]=num++;
return ;
}
if(n==2) //宽度为2,求出4个格子中的值
{
s[i][j]=num++;
s[i][j+1]=num++;
s[i+1][j+1]=num++;
s[i+1][j]=num++;
return ;
}
if(n==3) //宽度为3,求出9个格子中的值
{
s[i][j]=num++;
s[i][j+1]=num++;
s[i][j+2]=num++;
s[i+1][j+2]=num++;
s[i+2][j+2]=num++;
s[i+2][j+1]=num++;
s[i+1][j+1]=num++;
s[i+1][j]=num++;
s[i+2][j]=num++;
return ;
}
for(y=i,x=j;x<j+n;x++) //四个for循环,求出第一行从左向右
s[y][x]=num++;
for(y=i+1,x=j+n-1;y<i+n;y++) //最后一列,从上往下
s[y][x]=num++;
for(y=i+n-1,x=j+n-2;y>i;y--) //倒数第二列,从下往上
s[y][x]=num++;
for(y=i+1,x=j+n-3;x>=j;x--) //第二行,从右向左,依次求出每个格子中数值
s[y][x]=num++;
output(i+2,j,n-2); //递归
}

int main()
{
int n,T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
num=1;
output(1,1,n);
for(i=1;i<=n;i++)
{
for(j=1;j<n;j++)
printf("%d ",s[i][j]);
printf("%d\n",s[i][j]);
}
}
return 0;
}



posted on 2012-03-25 16:28  pcoda  阅读(164)  评论(0编辑  收藏  举报