RE#3、#5,求调
查看原帖
RE#3、#5,求调
1193354
Zero251楼主2024/4/25 00:12

测试点#3、#5RE,提示信息:Runtime Error. Received signal 6: Aborted / IOT trap.。 我不清楚是哪里越界了,有大佬有空帮忙看看吗?谢谢。

#include <cstdio>

class binTree{
    private:
    int depth,width,height;
    char **pic;
    public:
    binTree(int d){
        depth=d;
        if(d>1)
        height=(1<<(d-1))+(1<<(d-2));
        else
        height=1;
        width=(1<<d)+(1<<(d-1))-2;
        //printf("d=%d h=%d w=%d\n",depth,height,width);
        pic=new char*[height+1];
        for(int i=1;i<=height;i++){
            pic[i]=new char[width+2];
            for(int j=0;j<=width;j++)
            	pic[i][j]=' ';
            pic[i][width]='\0';
        }
        pic[1][width+1]='\0';
        set(height,width/2,depth);
    }
    ~binTree(){
        for(int i=1;i<=height;i++){
            delete[] pic[i];
        }
        delete[] pic;
    }
    void set(int r,int c,int d){
        if(d==1){
            pic[r][c]='o';
        }
        else{
            pic[r][c]='o';
            int len=((1<<(d-1))+(1<<(d-2))-1)/2;
            for(int i=1;i<=len;i++){
                pic[r-i][c+i]='\\'; 
                pic[r-i][c-i]='/';
            }
            set(r-len-1,c+len+1,d-1);
            set(r-len-1,c-len-1,d-1);
        }
    }
    void remove(int r,int c,int d){
		int len=((1<<(d-1))+(1<<(d-2))-1)/2;
		int uplen=((1<<d)+(1<<(d-1))-1)/2;;
		//printf("%d\n",uplen);
		if(uplen<=0)
			uplen=1;
        if(r<height&&pic[r+1][c-1]!=' ')
            for(int i=1;i<=uplen;i++)
            	pic[r+i][c-i]=' ';	
		if(r<height&&pic[r+1][c+1]!=' ')
			for(int i=1;i<=uplen;i++)
            	pic[r+i][c+i]=' ';
        if(d==1){
            pic[r][c]=' ';
        }
        else{
            pic[r][c]=' ';
            for(int i=1;i<=len;i++){
                pic[r-i][c+i]=' '; 
                pic[r-i][c-i]=' ';
            }
            remove(r-len-1,c+len+1,d-1);
            remove(r-len-1,c-len-1,d-1);
        }
    }
    void removeout(int fl,int num){
    	int subd=depth+1-fl;
    	int subh;
    	if(subd>1)
    		subh=(1<<(subd-1))+(1<<(subd-2));
    	else
    		subh=1;
    	int subw=(1<<subd)+(1<<(subd-1))-1;
    	int r=subh;
    	int c=subw*(num-1)+num-1+(subw-1)/2;
    	if(subd==1&&num%2==0)
    		c++;
    	//printf("%d %d %d\n",r,c,subd);
    	remove(r,c,subd);
	}
    void show(){
        for(int i=height;i>0;i--)
            printf("%s\n",pic[i]);
    }
};

int main(){
    int m,n;scanf("%d %d",&m,&n);
    binTree bT(m);
    for(int i=1;i<=n;i++){
    	int fl,num;scanf("%d %d",&fl,&num);
    	bT.removeout(fl,num);
	}
    bT.show();
    return 0;
}
2024/4/25 00:12
加载中...