您的位置:首页 > 其它

递归绘制图形

2018-01-23 20:29 381 查看
输入数字, 绘制如下图形





依次类推

这类使用递归画图的问题, 关键要找到规律.

把一张图的各个元素解构, 得出递归关系.

如改图P(n)即为

P(n-1) P(n-1)
P(n-1)
P(n-1) P(n-1)


找到每个图形的中心点, 然后分治地解决每个元素.

如此图可以左上图为中心, 计算其他图相对此图的位置, 然后依次递归

或以中间那个为中心点, 同理.

使用二维数组存储图形.

代码如下:

#include <iostream>
#include <cstring>
#define MAX 10000
using namespace std;

char map[MAX][MAX];

int Pow( int n )
{
int an = 1;
for( int i = 1; i <= n; ++i ){
an *= 3;
}
return an;
}

void print(char map[MAX][MAX], int size)
{
for( int i = 0; i < size; ++i )
{
for( int j = 0; j < size; ++j ) {
cout << map[i][j] << ' ';
}
cout << endl;
}
}

void draw(int n, int x, int y)
{
if( n == 1 ) {
map[x][y] = 'X';
} else {
int size = Pow(n-2);
draw(n - 1, x, y);
draw(n - 1, x + 2*size, y);
draw(n - 1, x + size, y + size);
draw(n - 1, x, y + 2*size);
draw(n - 1, x + 2*size, y + 2*size);
}
}

int main( )
{
int n;
cin >> n;
memset(map, ' ', sizeof(map));
draw(n, 0, 0);
int size = Pow(n-1);
print(map, size);
}


一道牛客网上练习赛的题目

道理相同, 找到各图形间距的规律

注意此题对输出格式有要求, 还应该注意内存不超过限度.

#include <iostream>
#include <cstring>
#define MAX 5000

using namespace std;

char map[MAX][MAX] = {};

int Pow(int n)
{
int p = 1;
for( int i = 1; i <= n; ++i ) {
p *= 3;
}
return p;
}

void draw(int n, int x, int y)
{
if( n == 0 ) {
map[x][y] = 'O';
} else {
int size = Pow(n-1);
draw(n-1, x, y - size);
draw(n-1, x - size, y);
draw(n-1, x + size, y);
draw(n-1, x, y + size);
}
}

void print(int size)
{
int end[MAX];
for( int i = 0; i < size; ++i ) {
for( int j = 0;j < size; ++j ) {
if(map[i][j] != ' ') end[i] = j;
}
}
for( int i = 0; i < size; ++i ) {
for( int j = 0; j <= end[i]; ++j ) {
cout << map[i][j];
}
cout << endl;
}
}

void loop(int n)
{
memset(map, ' ', sizeof(map));
int size = Pow(n);
draw(n, size/2, size/2);
print(size);
}

int main()
{
int t, n;
cin >> t;
while( t-- ) {
cin >> n;
loop(n);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: