模拟——洛谷P1185 绘制二叉树
2017-05-28 15:00
106 查看
https://www.luogu.org/problem/show?pid=1185
哈哈,我的代码是唯一一个不到1kb的;
时间不是最快的,但是我的代码没用hk跑;
要用hk跑的话,估计也快的飞起;
一看题目就感觉很有意思;
我的方法简单来说就是先找规律,然后一个dfs绘图;
首先我们考虑满二叉树;
我们先要确定画布大小;
然后juicy可以找到这么一种规律;
当k=1的时候,画布n=m=1;
当k!=1时
这个倒真的是找规律得出的;
所以我们的数组开800*1600就很好了;
然后我们先把这个画布填充成空格;
然后从根节点往下dfs画图;
画图方法在找画布的规律的时候自然而然地发现了;
这个难说啊,其实也是找规律了;
看我代码把
哈哈,我的代码是唯一一个不到1kb的;
时间不是最快的,但是我的代码没用hk跑;
要用hk跑的话,估计也快的飞起;
一看题目就感觉很有意思;
我的方法简单来说就是先找规律,然后一个dfs绘图;
首先我们考虑满二叉树;
我们先要确定画布大小;
然后juicy可以找到这么一种规律;
当k=1的时候,画布n=m=1;
当k!=1时
n=3; for(int i=3;i<=k;i++)n*=2; m=6*(1<<(k-2))-1;
这个倒真的是找规律得出的;
所以我们的数组开800*1600就很好了;
然后我们先把这个画布填充成空格;
然后从根节点往下dfs画图;
画图方法在找画布的规律的时候自然而然地发现了;
这个难说啊,其实也是找规律了;
看我代码把
#include<bits/stdc++.h>
#define Ll long long
using namespace std;
int k,n,m,p,x,y;
char c[800][1600];
bool f[800][1600];//在第x,y点,a,b是用来判节点的,k表示点还是边,xx,yy表示这个点或这个边的父亲
void dfs1(int x,int y,int a,int b,int k,int xx,int yy){
if(x==n){c[x][y]='o';return;}
if(k==1){
c[x][y]='o';
int X=xx+1,Y=(yy-1)*2+1;//左儿子
if(!f[X][Y])dfs1(x+1,y-1,a+1,b,2,X,Y);
X=xx+1,Y=yy*2;//又儿子
if(!f[X][Y])dfs1(x+1,y+1,a+1,b,3,X,Y);
}else
if(k==2){
c[x][y]='/';
if(a*2==b)dfs1(x+1,y-1,1,a,1,xx,yy);//这个就是判断接下来是边还是点
else dfs1(x+1,y-1,a+1,b,2,xx,yy);
}else
if(k==3){
c[x][y]=92;
if(a*2==b)dfs1(x+1,y+1,1,a,1,xx,yy);
else dfs1(x+1,y+1,a+1,b,3,xx,yy);
}
}
void make(int k){
n=3; for(int i=3;i<=k;i++)n*=2; m=6*(1<<(k-2))-1;//计算画布大小
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)c[i][j]=' ';//填充画布
dfs1(1,m/2+1,1,n,1,1,1);
}
int main()
{
scanf("%d%d",&k,&p);
while(p--){scanf("%d%d",&x,&y);f[x][y]=1;}//记录这个节点是否可以画
if(k==1)n=m=1,c[1][1]='o';else make(k);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)cout<<c[i][j];cout<<endl;
}
}
相关文章推荐
- Java基本功练习二十(图形【时钟模拟、绘制弧形多边形折线段、显示图像、消息显示面板等】)
- 使用graphviz绘制二叉树(二)
- nyoj 63(小猴子下落)(模拟,二叉树)
- NYOJ63 小猴子下落 (模拟二叉树)
- OpenGL由已知控制点绘制模拟曲面地形
- 浙大模拟(1)问题 C: 还原二叉树
- 某二叉树的先根遍历序列和后根遍历序列正好相反,则该二叉树具有的特征是()----腾讯2016研发工程师在线模拟笔试题
- 绘制二叉树
- Codeforces Round #362 (Div. 2) C 模拟二叉树
- 初识树结构,简单模拟无规律的二叉树,实现二叉树的构建,计算树的深度以及三种遍历方式以及搜索删除,销毁整个树
- python绘制二叉树的实现
- Windows系统功能模拟 C++(EasyX插件)—— 4th 界面绘制(二)
- 二叉树绘制器BinaryTreeDrawer实现
- 浅谈安卓Canvas,模拟心电图的绘制
- 使用graphviz绘制二叉树
- Python绘制直方图 Pygal模拟掷骰子
- 用VBS模拟二叉树,可以得到一个排序办法.
- Canvas的初识——模拟表盘数字绘制
- MFC中BMP图片旋转任意角度、用于绘制模拟时钟表针
- 【记录】2015/216数据结构大型实验 模拟登陆用户系统 二叉树的平衡 C++ MFC