简单递归之蛇形填数

时间限制:1000 ms  |  内存限制:65535 KB

【问题描述】

peter喜欢玩字母游戏,于是他编写了一个有趣的游戏。游戏规则是在一个 (N-1) * N的表格里填写字母,规则:对于每个输入的N,由 (N-1) * N的字母区域的左上角开始,从字母A开始逆时针填充一个字母区域,乘积若超过26继续由新一组的A、B、C„„填充,不要求输出边框。

【输入】

多组测试数据(数据量在100组以内)。每组测试数据只有一行为一个整数N(1<=N<=30),表示表格的宽度。

【输出】

对于每组输入数据,输出N-1行,为填完的表格(N-1行,每行N个整数,每个数字之间用空格隔开)。

【样例输入】

5

【样例输出】

代表一个4*5的顺时针旋转的字母区域,其样式如下:  

A B C D E

N O P Q F 

M T S R G 

L K J I H

代码如下:

#include<stdio.h>
char p[40][40];
void fill(char ch,int begin,int size)
{
if(size==0)
return ;
if(size==1)
{
p[begin][begin]=ch;
return ;}
int i=0;
int h=begin,v=begin;
p[h][v]=ch;
ch++;
for(i=0;i<size-2;i++)
{
if(ch=='Z')
{
         h++;
p[h][v]=ch;
ch='A';
}
else
{
h++;
p[h][v]=ch;
ch++;
}
}
for(i=0;i<size-1;i++)
{
if(ch=='Z')
{
         v++;
p[h][v]=ch;
ch='A';
}
else
{
v++;
p[h][v]=ch;
ch++;
}
}
for(i=0;i<size-2;i++)
{
if(ch=='Z')
{
         h--;
p[h][v]=ch;
ch='A';
}
else
{
h--;
p[h][v]=ch;
ch++;
}
}
for(i=0;i<size-2;i++)
{
if(ch=='Z')
{
       v--;
p[h][v]=ch;
ch='A';
}
else
{
v--;
p[h][v]=ch;
ch++;
}
}
fill(ch,v,size-2);
}
int main(void)
{





int n,h,v;
while(scanf("%d",&n)!=EOF)
{
fill('A',0,n);
for(h=0;h<n-1;h++)
{
for(v=0;v<n;v++)
printf("%c ",p[h][v]);
printf("\n");
}
}
return 0;
}

简单递归之蛇形填数_第1张图片

         此问题是一个典型的适合用递归进行解答的问题,因为通过观察可以发现,在字母矩阵的每一层(每一圈为一层)中,运算方式是一样的,因此可通过一个递归函数实现此种运算的重复运算。

你可能感兴趣的:(编程,算法,递归,程序设计,蛇形填数)