【洛谷】P1498 南蛮图腾(分治)题解

原题链接:https://www.luogu.org/problem/P1498

题目描述

自从到了南蛮之地,孔明不仅把孟获收拾的服服帖帖,而且还发现了不少少数民族的智慧,他发现少数民族的图腾往往有着一种分形的效果,在得到了酋长的传授后,孔明掌握了不少绘图技术,但唯独不会画他们的图腾,于是他找上了你的爷爷的爷爷的爷爷的爷爷……帮忙,作为一个好孙子的孙子的孙子的孙子……你能做到吗?


输入输出格式

输入格式:

每个数据一个数字,表示图腾的大小(此大小非彼大小) n<=10

输出格式:

这个大小的图腾


输入输出样例

输入样例#1:

2

输出样例#1:

   /\
  /__\
 /\  /\
/__\/__\

输入样例#2:

3

输出样例#2:

       /\
      /__\
     /\  /\
    /__\/__\
   /\      /\
  /__\    /__\
 /\  /\  /\  /\
/__\/__\/__\/__\

说明

时空限制:1000ms 125M


思路:

图形就是由一个不断向右复制一个再向上复制一个,慢慢扩大。所以只需要把第一个图形存入数组,接下来复制n-1次,不断将图形向右和向上复制一次,每次复制完后宽度变大两倍。

须注意的点:

  1. 数组ch[ ][ ]不仅要定义为全局变量,也要初始化,全部赋值为空格。
  2. ’ \ ’是转义字符,需写成’ \ ’。
  3. 第一个图形要倒着存入数组,这样才便于复制,不然无法向上复制,最后输出要从下往上,从左往右输出。

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring> 
char ch[5000][5000];	//必须定义为全局变量 
using namespace std;
int main(){
	ios::sync_with_stdio(false);	//取消同步 
	int n,wide=4;
	cin>>n;
	memset(ch,' ',sizeof(ch));	//全部初始化为空格 
	 /*
        将第一个图形倒着存入数组,这样才便于复制,不然无法向上复制 
         /\       /__\
        /__\       /\
    */
	ch[0][0]=ch[1][1]='/';
	ch[0][1]=ch[0][2]='_';
	ch[0][3]=ch[1][2]='\\';
	for(int t=1;t<=n-1;t++){	//复制n-1遍 
		for(int i=0;i<wide/2;i++){	//遍历高 
			for(int j=0;j<wide;j++){	//遍历宽 
				ch[i][j+wide]=ch[i][j];	//向右复制一个 
				ch[i+wide/2][j+wide/2]=ch[i][j];	//向上复制一个,倒着存储 
			}
		}
		wide*=2;	//图形扩大两倍 
	}
	for(int i=wide/2-1;i>=0;i--){	//从下往上输出 
		for(int j=0;j<wide;j++){	//从左往右输出 
			cout<<ch[i][j];
		}
		cout<<endl;	//换行 
	}
	return 0;
}
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值