题目描述
对于给定的数字N,绘制图形A
图形描述
1.当N=1时,绘制的A
2.当N=2时,绘制的A
2.当N=3时,绘制的A
思路
我们发现当N=2时,第二个图形其实是由8个单独的A组成的。
当N=3时,第3个图形其实是由8个图像二组成的。之后的过程可以递归得到。
那么我们可以推出f[i]=8*f[i-1],我们就可以使用递归来绘制这个图形。我们可以使用一个二维数组来表示这个图形,那么唯一的问题是怎么填充整个二维数组。
核心问题是:
度数为N的图形G(n)可以由以下递归式子表示:
设递归函数void draw(int n,int x,int y)表示在(x,y)位置开始设置度数为n的图形,它由8个度数为n-1的图形组成,其起始位置从上到下,从左到右分别为:(x,y)、(x+1,y-1)、(x+1,y+1)、(x+2,y-2)、(x+2,y+2)、(x+3,y-3)、(x+3,y+3)、(x+4,y-4)、(x+4,y+4)。
c++版代码中的坐标系和Java版定义不同,注意区别
代码C++版
#include <iostream>
#include <cmath>
using namespace std;
void paint(char **out, int c, int ybegin, int xbegin)
{
if (c == 1)
{
out[ybegin][xbegin] = 'A';
}
else
{
int curBlankY = (int)pow(4, c - 2);
int curBlankX = curBlankY;
paint(out, c - 1, ybegin, xbegin + 3 * curBlankX);
paint(out, c - 1, ybegin + curBlankY, xbegin + 2 * curBlankX);
paint(out, c - 1, ybegin + curBlankY, xbegin + 4 * curBlankX);
paint(out, c - 1, ybegin + curBlankY * 2, xbegin + 1 * curBlankX);
paint(out, c - 1, ybegin + curBlankY * 2, xbegin + 3 * curBlankX);
paint(out, c - 1, ybegin + curBlankY * 2, xbe