这道题是画图题,画图题当画布总大小较小的时候其实可以先创建一个二维数组,这样就可以实现随意移动“光标”式的画图,然后直接输出处理后的画布即可,只要注意题目要求的数据范围足够小、画布不会让你的程序MLE就行。
但我做这道题的时候忘了这个,直接用比较麻烦的办法做的,但是由于使用了OOP来描述树和一个队列来管理树枝,整体代码清晰度也很高,就是长了一些。
但是写成后发现只得了89分,WA了一个点。调试后发现是因为我对一个空队列使用了front()成员函数,下次一定要注意,访问STL的数据结构内的数据的时候要确保其中有数据,否则就会出错,偏偏不知道为什么没有抛出异常、至少没有报错。总之下次引用front()时最好在前面加一个!q.empty()&&利用&&的短路属性来防止访问不存在的量。
但是更改后还是只有89分,没想明白错在哪里
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;
}
标签:int,画布,pow2,89,P1185,include,100
From: https://www.cnblogs.com/gongkai/p/17800051.html