您的位置:首页 > 其它

2018_2_11_Creating a Quadtree_四叉树

2018-02-11 22:21 309 查看
https://vjudge.net/problem/UVA-11941
m可以为0;

#include<cstring>
#include <iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
using namespace std;
char g[1024][1024];
char node[1024*1024];

set<int> si;
int a[30];

void init(){
int t=1;
for(int i=0;i<30;i++){
si.insert(t*=2);
a[i]=t*2;
}
}

int build(int k,int lx,int ly,int rx,int ry){
if(lx==rx&&ly==ry)
return node[k]=(1<<g[lx][ly]);
int mx=(lx+rx)/2,my=(ly+ry)/2;
int v=0;
v|=build(k*4,lx,ly,mx,my);
v|=build(k*4+1,mx+1,ly,rx,my);
v|=build(k*4+2,lx,my+1,mx,ry);
v|=build(k*4+3,mx+1,my+1,rx,ry);
return node[k]=v;
}

void dfs(int u){
if(node[u]==3){
if(u>1)putchar('*');
dfs(u*4);
dfs(u*4+1);
dfs(u*4+2);
dfs(u*4+3);
}else{
if(node[u]==1)putchar('0');
else putchar('1');
}
}

int main(){
int z;
scanf("%d",&z);
while(getchar()!='\n');
char line[32767];
init();
while(z--){
gets(line);
stringstream sin(line);
string token;
int n;
sin>>n;
if(si.find(n)==si.end()||n<=1){
puts("Size is invalid");continue;
}
memset(g,0,sizeof(g));
int sx,sy,ex,ey;
while(sin>>token){
sscanf(token.c_str(),"(%d,%d)",&sx,&sy);
if(sin>>token){
sscanf(token.c_str(),"(%d,%d)",&ex,&ey);
sx--,sy--,ex--,ey--;
for(int i=sx;i<=ex;i++)
for(int j=sy;j<=ey;j++)
g[i][j]=1;
}
}
build(1,0,0,n-1,n-1);
dfs(1);
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: