#include<stdio.h>
#include<malloc.h>
void CreatBinarTree(char** binarytree,int i,int j,int m,int cnt,int *layer);
void InitLayer(int * layer,int m,int lin);
void PrintTree(char** binarytree,int col,int lin);
void DeleteBinarTree(char** binarytree,int i,int j,int m,int cnt,int *layer);
void InitLen(int *len,int m);
int main()
{
int m,n,h,num;//h为二叉树的高度,num为二叉树次下层节点数
scanf("%d %d",&m,&n);
if(m==1 && n==0)
{
printf("o");
return 0;
}else if(m==1 && n!=0)
{
int x,y;
for(int i=0;i<n;i++)
{
scanf("%d %d",&x,&y);
}
printf(" ");
return 0;
}
h=m-1;
num=1<<(h-1);
int col,lin;
col=num*6-1;//最后一行含空格的长度
lin=col/2+1;
char* binarytree[lin];//[col]
for(int i=0;i<lin;i++)
{
binarytree[i]=(char*)malloc(col*sizeof(char));
}
for(int i=0;i<lin;i++)
{
for(int j=0;j<col;j++)
{
binarytree[i][j]=' ';
}
}
binarytree[0][col/2]='o';
int layer[m];
//int len[m];
InitLayer(layer,m,lin);
CreatBinarTree(binarytree,0,col/2,lin-1,1,layer+1);
//InitLen(len,m);
int pos[1023][2];
int count=0;
for(int i=0;i<lin;i++)
{
for(int j=0;j<col;j++)
{
if(binarytree[i][j]=='o')
{
pos[count][0]=i;
pos[count][1]=j;
count++;
}
}
}
for(int i=0;i<n;i++)
{
int x,y;
scanf("%d %d",&x,&y);
x=x-1;
int staus;
staus=y%2;
y=(y+1)/2;
int no=(1<<(x-1))+y-1;
x=pos[no-1][0];
y=pos[no-1][1];
if(staus)
{
DeleteBinarTree(binarytree,x+1,y-1,lin-1,x+2,layer);
}else
{
DeleteBinarTree(binarytree,x+1,y+1,lin-1,x+2,layer);
}
}
PrintTree(binarytree,col,lin);
return 0;
}
void CreatBinarTree(char** binarytree,int i,int j,int m,int cnt,int *layer)
{
if(binarytree[i][j]=='o' && cnt<=m)
{
binarytree[i+1][j-1]='/';
CreatBinarTree(binarytree,i+1,j-1,m,cnt+1,layer);
binarytree[i+1][j+1]='\\';
CreatBinarTree(binarytree,i+1,j+1,m,cnt+1,layer);
}else if(binarytree[i][j]=='/' && layer[0]!=cnt)
{
binarytree[i+1][j-1]='/';
CreatBinarTree(binarytree,i+1,j-1,m,cnt+1,layer);
}else if(binarytree[i][j]=='/' && layer[0]==cnt)
{
binarytree[i+1][j-1]='o';
CreatBinarTree(binarytree,i+1,j-1,m,cnt+1,layer+1);
}else if(binarytree[i][j]=='\\' && layer[0]!=cnt)
{
binarytree[i+1][j+1]='\\';
CreatBinarTree(binarytree,i+1,j+1,m,cnt+1,layer);
}else if(binarytree[i][j]=='\\' && layer[0]==cnt)
{
binarytree[i+1][j+1]='o';
CreatBinarTree(binarytree,i+1,j+1,m,cnt+1,layer+1);
}
return;
}
void InitLayer(int * layer,int m,int lin)//已调试
{
layer[m-1]=lin-1;
int n=m-1;
int len=1;
for(int i=1;i<m;i++)
{
layer[n-1]=layer[n]-len-1;
len+=len+(i-1);
n--;
}
}
void PrintTree(char** binarytree,int col,int lin)
{
for(int i=0;i<lin;i++)
{
for(int j=0;j<col;j++)
{
printf("%c",binarytree[i][j]);
}
if(i!=lin-1)
{
printf("\n");
}
}
}
void DeleteBinarTree(char** binarytree,int i,int j,int m,int cnt,int *layer)
{
if(cnt>m)
{
binarytree[i][j]=' ';
return;
}
if(binarytree[i][j]=='o' && cnt<=m)
{
DeleteBinarTree(binarytree,i+1,j-1,m,cnt+1,layer);
DeleteBinarTree(binarytree,i+1,j+1,m,cnt+1,layer);
binarytree[i][j]=' ';
}else if(binarytree[i][j]=='/' && layer[0]!=cnt)
{
DeleteBinarTree(binarytree,i+1,j-1,m,cnt+1,layer);
binarytree[i][j]=' ';
}else if(binarytree[i][j]=='/' && layer[0]==cnt)
{
DeleteBinarTree(binarytree,i+1,j-1,m,cnt+1,layer+1);
binarytree[i][j]=' ';
}else if(binarytree[i][j]=='\\' && layer[0]!=cnt)
{
DeleteBinarTree(binarytree,i+1,j+1,m,cnt+1,layer);
binarytree[i][j]=' ';
}else if(binarytree[i][j]=='\\' && layer[0]==cnt)
{
DeleteBinarTree(binarytree,i+1,j+1,m,cnt+1,layer+1);
binarytree[i][j]=' ';
}
return;
}
void InitLen(int *len,int m)
{
len[0]=1;
for(int i=1;i<m;i++)
{
len[i]=len[i-1]+i;
}
}
题目样例和自己设计的几个数据都过了,不知道有哪些数据过不了?