一道极为恐怖的模拟题,以定义函数的方式确定每个点的x,y就能轻松的做出这道题,参考神犇题解 洛谷 P1185 - KH's blog - 洛谷博客
遇到这种题估计就是放弃了。
AC代码(抄的)
#include <bits/stdc++.h>
using namespace std;
int a[12]={0,1,2,5,11,23,47,95,191,383,767,1535};
char ans[2000][2000];
bitset<2000>t;
int n,m;
void draw(int,int,int,int);
void drawr(int p,int n,int x,int y){
int i=x,j=y,tmp=a[n];
while(tmp--){
i++,j++;
ans[i][j]='\\';
}
i++,j++;
ans[i][j]='o';
draw(p,n-1,i,j);
}
void drawl(int p,int n,int x,int y){
int i=x,j=y,tmp=a[n];
while(tmp--){
i++,j--;
ans[i][j]='/';
}
i++,j--;
ans[i][j]='o';
draw(p,n-1,i,j);
}
void draw(int p,int n,int x,int y){
if(n==0)return;
if(t[p<<1]){
drawl(p<<1,n,x,y);
}
if(t[p<<1|1]){
drawr(p<<1|1,n,x,y);
}
}
int main(){
for(int i=0;i<2000;i++){
for(int j=0;j<2000;j++){
ans[i][j]=' ';
}
}
scanf("%d %d",&m,&n);
for(int i=1;i<(1<<m);i++){//存在这个节点
t[i]=true;
}
while(n--){
int i,j;
scanf("%d %d",&i,&j);
int tmp=(1<<(i-1))-1;
tmp+=j;
t[tmp]=0;//删掉节点
}
ans[1][a[m]+1]='o';//根节点
draw(1,m-1,1,a[m]+1);
for(int i=1;i<=a[m]+1;i++){
for(int j=1;j<=a[m+1]+1;j++){
cout<<ans[i][j];
}
cout<<endl;
}
return 0;
}