简单递归之蛇形填数
2014-11-29 09:24
169 查看
时间限制: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;
}
此问题是一个典型的适合用递归进行解答的问题,因为通过观察可以发现,在字母矩阵的每一层(每一圈为一层)中,运算方式是一样的,因此可通过一个递归函数实现此种运算的重复运算。
【问题描述】
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;
}
此问题是一个典型的适合用递归进行解答的问题,因为通过观察可以发现,在字母矩阵的每一层(每一圈为一层)中,运算方式是一样的,因此可通过一个递归函数实现此种运算的重复运算。
相关文章推荐
- 实现递归的简单实例
- 递归的简单解释
- (课本习题)一个简单的用递归解决的小程序
- 递归经典简单问题之猴子吃桃
- 用栈和递归求解两顶点的所有简单路径
- linux下压缩与解压缩的简单记忆方法;递归删除文件夹
- (课本习题)一个简单的用递归解决的小程序
- linux下递归删除文件夹,简单实现rm的功能
- 初学者看过来:简单谈谈 C/C++ 递归的思想,实现,以及和循环的关系。
- 最简单的递归遍历CTreeCtrl树C++代码
- 递归的简单解释
- demo : 简单的 xslt 递归解析 xml 成 tree
- C# 回顾简单XML动态递归绑定TreeView
- 递归的简单例子 3n+1问题
- 简单的递归程序,怎么考试的时候我就糊涂了呢?
- 删除内存树结构的时候,千万注意内存泄漏问题,采用递归比较简单。
- 4.5.1简单递归消除
- 简单二叉树的创建和输出(递归)
- 递归简单实例
- 用递归实现简单的tree