递归画图形
Posted DakerYi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归画图形相关的知识,希望对你有一定的参考价值。
这道题目来自百度笔试题,当然还有很多这类题,都是一个套路,下面将会讲解这个套路:
问题讲解
首先,我觉得这一类题都是一个套路,让我们来先认识一下:
一般递归画图形这种题目,都是先给你一个原始图形(最简单的),然后让你在这个图形的周围画出和它一样的图形,随着层数增加,图形会成指数倍增加,例如:
输入n,
当n==1时:
o
当n==2时:
o
ooo
o
当n==3时:
o
ooo
o
o o o
ooooooooo
o o o
o
ooo
o
当n==4时:
o
ooo
o
o o o
ooooooooo
o o o
o
ooo
o
o o o
ooo ooo ooo
o o o
o o o o o o o o o
ooooooooooooooooooooooooooo
o o o o o o o o o
o o o
ooo ooo ooo
o o o
o
ooo
o
o o o
ooooooooo
o o o
o
ooo
o
。。。
应该理解什么这种题的思路了,然后我们来看看怎么解决。
解决方案
这种套路,我们一般使用递归,步骤是:
1. 求中心坐标
2. 画自己
3. 在自己上右下左方向都画一个自己
怎么画呢?我们一般使用一个二维的数组,然后在里面做标记。
好了,来上代码:
例如这道题:
1. 求中心点
我们观察图形,可以得到每个图形的中心点是:
(1,1),(2,2),(5,5),(14,14) …
咋一看,规律是:
原坐标+3^(n-1),看看是不是
2. 画图形
这是个递归的过程,上代码:
void draw(int x, int y, int n)
int temp = pow(3,n-2);
if(n==1)
a[x][y] = 'o';
else
draw(x,y,n-1);
draw(x-temp,y,n-1);
draw(x+temp,y,n-1);
draw(x,y-temp,n-1);
draw(x,y+temp,n-1);
函数的意思就是,x,y表示中心点,n表示层数。temp=3^(n-2) 表示上下左右的图形的中心距离我中心的距离,所以在画上方的时候是:draw(x-temp, y, n-1). 当 n==1 的时候,在矩阵中添加一个”o”, 否则表示当前要画的图形层数还大于1,还可以交给下一层画,所以:
draw(x,y,n-1);
draw(x-temp,y,n-1);
draw(x+temp,y,n-1);
draw(x,y-temp,n-1);
draw(x,y+temp,n-1);
表示画自己,画上,画下,画左,画右。
3. 调用draw函数
所以现在只需要你计算一个中心点坐标,以及层数告诉我,我就可以画图形。当然我不是自己画,我是交给我的下一层画,直到最简单的图形(n==1),图形就出来了。
上代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define N 1000
char a[N][N];
void draw(int x, int y, int n)
int temp = pow(3,n-2);
if(n==1)
a[x][y] = 'o';
else
draw(x,y,n-1);
draw(x-temp,y,n-1);
draw(x+temp,y,n-1);
draw(x,y-temp,n-1);
draw(x,y+temp,n-1);
int main()
int n;
int b;
cin>>n;
int m = n;
while(n--)
cin>>b;
memset(a,' ',sizeof(a));
if(b == 1)
draw(1,1,1);
else
int x= pow(3,b-2)+(pow(3,b-2)+1)/2;
draw(x,x,b);
cout<<"Case #"<<m-n<<":"<<endl;
int temp = pow(3,b-1);
for(int i=1; i<=temp; i++)
for(int j=1; j<=temp; j++)
cout<<a[i][j];
cout<<endl;
return 0;
以上是关于递归画图形的主要内容,如果未能解决你的问题,请参考以下文章