这道题是画图题,画图题当画布总大小较小的时候其实可以先创建一个二维数组,这样就可以实现随意移动“光标”式的画图,然后直接输出处理后的画布即可,只要注意题目要求的数据范围足够小、画布不会让你的程序MLE就行。

但我做这道题的时候忘了这个,直接用比较麻烦的办法做的,但是由于使用了OOP来描述树和一个队列来管理树枝,整体代码清晰度也很高,就是长了一些。

但是写成后发现只得了89分,WA了一个点。调试后发现是因为我对一个空队列使用了front()成员函数,下次一定要注意,访问STL的数据结构内的数据的时候要确保其中有数据,否则就会出错,偏偏不知道为什么没有抛出异常、至少没有报错。总之下次引用front()时最好在前面加一个!q.empty()&&利用&&的短路属性来防止访问不存在的量。

但是更改后还是只有89分,没想明白错在哪里

结果,一位乐于助人的洛谷大佬给出了hack数据,根据对这个数据标答和我的答案不同的输出我发现我可以尝试删除“m=T.setd();//更新树的深度”这一行,结果我简单的删除了那一行就直接AC了。看来是对题意的理解不同,不过我重新读了一遍题之后发现题意其实没说清这块,而且我的代码这种删除后更新树的深度的方式其实更接近于合理的理解,数据的理解则是像是没考虑到更新树的深度一样。不过就这样吧,这题解决了。

收获:1.画图函数数据范围不大就考虑用画布数组,这样能大大降低思维复杂度

2、STL结构用完后别忘了清空,同时数据结构可能为空的情况下不要贸然访问!加一个判断是否为空的步骤!

3、多读题,确保对题意理解没有偏差,一字一句的读,不差这点时间!

89昏-Code

#include <iostream>
#include <cstdio>
#include <string>
#include <queue>
using namespace std;
int c[100],l[100],d[100],pow2[100],n,m,a,b;
int intpow(int a,int b)
{
int ans=1;
for(int i=1;i<=b;i++)ans*=a;
return ans;
}
struct tree
{
int t[2000];
int d,e;
void start(int D)
{
d=D;e=intpow(2,d)-1;
for(int i=1;i<=e;i++)t[i]=1;
}
void del(int P)
{
t[P]=0;
if(P*2+1<=e)
{
del(P*2);
del(P*2+1);
}
}
int setd()
{
int i;
for(i=e;i>=1;i--)
if(t[i]==1)
break;
while(i<=(e+1)/2-1)e=(e+1)/2-1,d--;
return d;
}
int isexisted(int a,int b)
{
if(t[intpow(2,a-1)-1+b]==1)return 1;
else return 0;
}
int isexisted(int no)
{
if(t[no]==1)return 1;
else return 0;
}
}T;
queue<int> Ql,Qr,nQl,nQr;
int main()
{
cin>>m>>n;
T.start(m);
for(int i=1;i<=n;i++)
{
cin>>a>>b;
T.del(intpow(2,a-1)-1+b);
}
m=T.setd();
l[1]=1;l[2]=5;c[1]=1;c[2]=3;d[1]=2;d[2]=3;pow2[0]=1,pow2[1]=2,pow2[2]=4;
for(int i=3;i<=m;i++)
l[i]=l[i-1]*2+1,c[i]=c[i-1]*2,d[i]=d[i-1]*2,pow2[i]=pow2[i-1]*2;
for(int i=1,p=1,lno=m,kno=m-1,no=1;i<=c[m];i++)
{
if(i==c[m])
{
string s="o ";if(m==1)s="o";
for(int q=1;q<=pow2[no-1];q++)
{
for(int j=1;j<=(l[lno]-1)/2;j++)cout<<' ';
if(T.isexisted(no,q)==1)cout<<s;else cout<<" ";//no是层,q是层内序号
for(int j=1;j<=(l[lno]-1)/2;j++)cout<<' ';
if(q!=pow2[no-1])cout<<' ';
if(s=="o ")s=" o";else s="o ";
}
}
else if(i==p)
{
while(!Ql.empty())Ql.pop();
while(!Qr.empty())Qr.pop();
for(int q=1,t=1;q<=pow2[no-1];q++)
{
for(int j=1;j<=(l[lno]-1)/2;j++)cout<<' ',t++;
if(T.isexisted(no,q)==1)
{
cout<<"o";
if(T.isexisted((intpow(2,no-1)-1+q)*2)==1)Ql.push(t-1);
if(T.isexisted((intpow(2,no-1)-1+q)*2+1)==1)Qr.push(t+1);
t++;
}
else
cout<<' ',t++;//no是层,q是层内序号
for(int j=1;j<=(l[lno]-1)/2;j++)cout<<' ',t++;
if(q!=pow2[no-1])cout<<' ',t++;
}
cout<<endl;
p+=d[kno];
kno--;
lno--;
no++;
}
else
{
for(int j=1;j<=l[m];j++)
{
if(!Ql.empty()&&j==Ql.front())cout<<'/',nQl.push(Ql.front()-1),Ql.pop();
else if(!Qr.empty()&&j==Qr.front())cout<<'\\',nQr.push(Qr.front()+1),Qr.pop();
else cout<<' ';
}
cout<<endl;
Ql=nQl;Qr=nQr;
while(!nQl.empty())nQl.pop();
while(!nQr.empty())nQr.pop();
}
}
return 0;
}

AC-Code

#include <iostream>
#include <cstdio>
#include <string>
#include <queue>
using namespace std;
int c[20],l[20],d[20],pow2[20],n,m,a,b;
int intpow(int a,int b)//乘方运算函数
{
int ans=1;
for(int i=1;i<=b;i++)ans*=a;
return ans;
}
struct tree
{
int t[1030];
int d,e;
void start(int D)
{
d=D;e=intpow(2,d)-1;
for(int i=1;i<=e;i++)t[i]=1;
}
void del(int P)
{
t[P]=0;
if(P*2+1<=e)
{
del(P*2);
del(P*2+1);
}
}
int setd()
{
int i;
for(i=e;i>=1;i--)
if(t[i]==1)
break;
while(i<=(e+1)/2-1)e=(e+1)/2-1,d--;
return d;
}
int isexisted(int a,int b)
{
if(t[intpow(2,a-1)-1+b]==1)return 1;
else return 0;
}
int isexisted(int no)
{
if(t[no]==1)return 1;
else return 0;
}
}T;
queue<int> Ql,Qr,nQl,nQr;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0); //加速IO用的,不要在意这两行
cin>>m>>n;
T.start(m);//初始化树
for(int i=1;i<=n;i++)
{
cin>>a>>b;
T.del(intpow(2,a-1)-1+b);
}
//m=T.setd();//更新树的深度
//辅助数组
l[1]=1;l[2]=5;c[1]=1;c[2]=3;d[1]=2;d[2]=3;pow2[0]=1,pow2[1]=2,pow2[2]=4;
for(int i=3;i<=m;i++)
l[i]=l[i-1]*2+1,c[i]=c[i-1]*2,d[i]=d[i-1]*2,pow2[i]=pow2[i-1]*2;
//没有画布数组,直接把结果按顺序输出
for(int i=1,p=1,lno=m,kno=m-1,no=1;i<=c[m];i++)
{
if(i==c[m])
{
string s="o ";if(m==1)s="o";
for(int q=1;q<=pow2[no-1];q++)
{
for(int j=1;j<=(l[lno]-1)/2;j++)cout<<' ';
if(T.isexisted(no,q)==1)cout<<s;else cout<<" ";//no是层,q是层内序号
for(int j=1;j<=(l[lno]-1)/2;j++)cout<<' ';
if(q!=pow2[no-1])cout<<' ';
if(s=="o ")s=" o";else s="o ";
}
}
else if(i==p)
{
while(!Ql.empty())Ql.pop();
while(!Qr.empty())Qr.pop();
for(int q=1,t=1;q<=pow2[no-1];q++)
{
for(int j=1;j<=(l[lno]-1)/2;j++)cout<<' ',t++;
if(T.isexisted(no,q)==1)
{
cout<<"o";
if(T.isexisted((intpow(2,no-1)-1+q)*2)==1)Ql.push(t-1);
if(T.isexisted((intpow(2,no-1)-1+q)*2+1)==1)Qr.push(t+1);
t++;
}
else
cout<<' ',t++;//no是层,q是层内序号
for(int j=1;j<=(l[lno]-1)/2;j++)cout<<' ',t++;
if(q!=pow2[no-1])cout<<' ',t++;
}
cout<<endl;
p+=d[kno];
kno--;
lno--;
no++;
}
else
{
for(int j=1;j<=l[m];j++)
{
if(!Ql.empty()&&j==Ql.front())cout<<'/',nQl.push(Ql.front()-1),Ql.pop();
else if(!Qr.empty()&&j==Qr.front())cout<<'\\',nQr.push(Qr.front()+1),Qr.pop();
else cout<<' ';
}
cout<<endl;
Ql=nQl;Qr=nQr;
while(!nQl.empty())nQl.pop();
while(!nQr.empty())nQr.pop();
}
}
return 0;
}

P1185【绿】的更多相关文章

  1. 如何优雅使用Sublime Text3(Sublime设置豆沙绿背景色和自定义主题)

    ♣Sublime Text3软件的下载 ♣设置字体的大小 ♣设置背景色和关键字颜色(Color Scheme 生成器) ♣快速生成html头文件 1.Sublime Text3软件的下载地址和包含的文 ...

  2. Adobe Reader/Acrobat修改页面底色为豆沙绿

    Adobe Acrobat_Pro_8修改PDF页面底色为豆沙绿保护视力(同样适用于Adobe Reader) http://jingyan.baidu.com/article/9989c746189 ...

  3. 通过sougou输入法,解决卡在Setup Wizard(小绿人)界面

    本人使用海信EG900手机(安卓2.3.5,已root),为了使用google的服务,先后手动复制和CWM recovery刷入google服务包(gapps-gb-20110828-signed.z ...

  4. 紫橙绿蓝的jQuery幻灯片切换

      效果展示 http://hovertree.com/texiao/jquery/77/ 看惯了左右切换的幻灯片,何问起向您推荐一个新颖的,旋转切换,通过点击按钮的相应区域可以使幻灯片以旋转的方式来 ...

  5. Win7下如何设置护眼的电脑豆沙绿界面?保护眼睛的颜色设置教程

    关爱心灵的窗户——眼睛! 随着科技发展,使用电脑的人越来越多,由于使用电脑时间过长,我们的眼睛也越发容易疲劳,干燥.如何才能使电脑对人眼的伤害减小到最 小. 小编建议大家可以把窗口背景色设置成护眼色. ...

  6. 傻瓜式十分钟免费开启 HTTPS,是时候为你的站点加上小绿锁了

    http://gold.xitu.io/entry/57df65690bd1d00057f9455b?from=singlemessage&isappinstalled=0 原文链接:http ...

  7. WPF:定制Checkbox样式,让“正确”绿得好看,让“错误”红的显眼

    WPF提供了样式.模板.触发器.状态管理.矢量形状等方式,让我们不需要背景图片,也可以轻松定制控件的风格样式.下面是笔者针对Checkbox进行的样式定制,让“正确”绿得好看,让“错误”红的显眼.  ...

  8. QQMusic绿钻兄,你可安好?我需要晴天。

    不好意思,年纪这样大了,还依靠吐槽来保持呆毛的正能量,实在对不住,先说对不起. QQMusic是我最喜欢的腾讯增值服务,正版内容,海量歌手,高清下载.实在是音乐软件中高大上的典范,除了歌手排名中前十中 ...

  9. [汇编语言]-第九章 在屏幕中间分别显示绿底红色,白底蓝色字符串"welcome to masm!"

    ;在屏幕中间分别显示绿色,绿底红色,白底蓝色字符串"welcome to masm!" assume cs:codesg,ds:datasg,ss:stacksg datasg s ...

  10. 刷爆github小绿点

    转载请注明出处:https://ahangchen.gitbooks.io/windy-afternoon/content/kit/git/green_blush.html 工程地址,欢迎star!! ...

随机推荐

  1. CentOS(7.6)环境下迁移Mysql(5.7)的data目录到指定位置

    第一步:关闭Mysql #关闭Mysql服务systemctl stop mysqld#查看Mysql服务状态 ps -ef|grep mysql 第二步:创建新目录,并拷贝数据文件 #创建data文 ...

  2. Mybatis|MybatisPlus批量插入

    创建一个SpringBoot工程 <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...

  3. lxml模块

    lxml主要用xpath.css选择器等来提取xml格式文档,html也是xml格式文档的一种. xpath方法返回列表的三种情况 返回空列表:没有找到任何元素 返回字符串列表:xpath规则匹配用了 ...

  4. 2024年 Kubernetes 四大趋势预测

    Kubernetes 在生产环境中的复杂性已经成为常态,在2023年这个平台工程盛行的时代,容器管理的最大亮点可能在于其灵活性,然而在运维政策和治理等方面仍然存在诸多挑战.Kubernetes 最大的 ...

  5. 【fmjava】 面试题突击训练-Java基础语法篇01

    JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称, Java 开发工具包, 提供了 Java 的开发环境和运行环境. JRE:Java Runtime Env ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (47)-- 算法导论6.1 5题

    五.一个已排好序的数组是一个最小堆吗? 文心一言: 一个已排好序的数组不一定是一个最小堆.最小堆是一种特殊的二叉树,它满足以下性质:对于任意节点 x,其父节点 y 的值都小于等于 x 的值.而一个已排 ...

  7. 【华为云技术分享】云容器引擎 CCE权限管理实践

    随着容器化的快速发展,大数据原有的分布式任务调度模式,正在被基于Kubernetes的技术架构所取代.CCE云容器引擎是华为云推出的支持Kubernetes社区原生应用和工具,应用级自动弹性伸缩,自动 ...

  8. 解读clickhouse存算分离在华为云实践

    摘要:本文是我们对clickhouse做了最简单的支持obs的适配改造. 本文分享自华为云社区<clickhouse存算分离在华为云实践>,作者: he lifu. clickhouse是 ...

  9. Apache Superset 1.2.0教程 (一)—— 安装(Windows版)

    Apache Superset 是一款由 Airbnb 开源的"现代化的企业级 BI(商业智能) Web 应用程序",其通过创建和分享 dashboard,为数据分析提供了轻量级的 ...

  10. 6个步骤强化 CI/CD 安全

    快速的数字化和越来越多的远程业务运营给开发人员带来了沉重的负担,他们不断面临着更快推出软件的压力.尽管CI/CD 加速了产品发布,但它容易受到网络安全问题的影响,例如代码损坏.安全配置错误和机密管理不 ...