下面附加三份代码,自行体会之间的差别
#include<iostream>
#include<cstring>
#include<cstdio>
#include<sstream>
using namespace std;
int p[1025][1025];
int node[1025*1025];
int build(int k,int lx,int ly,int rx,int ry)
{
if(lx==rx&&ly==ry)
return node[k]=(1<<p[lx][ly]); //该块为黑色 则节点值为1, 为白色 节点值为2
int mx=(lx+rx)/2,my=(ly+ry)/2;
int v=0;
//计算四个子矩阵。或运算,如果四个子矩阵均为黑,则v=1,均为白,则为2,有黑有白则为3
//同时也放方便进行遍历。v==3的时候继续向下遍历,否则输出。
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;
}
//cout<<"123"<<endl;
void dfs(int u)
{
if(node[u]==3)
{
if(u>1)
putchar('*');
dfs(4*u);
dfs(4*u+1);
dfs(4*u+2);
dfs(4*u+3);
}
else
{
if(node[u]==2)
putchar('1');
else
putchar('0');
}
}
int main()
{
int n,lx,ly,rx,ry,m;
char str[32767];
scanf("%d",&m);
getchar();
while(m--)
{
gets(str);
stringstream sin(str);
string s;
sin>>n;
// cout<<n<<endl;
if(__builtin_popcount(n)!=1||n<=1)
{
puts("Size is invalid");
continue;
}
memset(p,0,sizeof(p));
while(sin>>s)
{
sscanf(s.c_str(),"(%d,%d)",&lx,&ly);
// cout<<lx<<" "<<ly<<endl;
if(sin>>s)
{
sscanf(s.c_str(),"(%d,%d)",&rx,&ry);
lx--,ly--,rx--,ry--;
for(int i=lx;i<=rx;i++)
for(int j=ly;j<=ry;j++)
p[i][j]=1; //白色 1 黑色 0
}
}
build(1,0,0,n-1,n-1);
dfs(1);
puts("");
}
return 0;
}
/*
3
4 (1,1) (1,1) (4,1) (4,1) (1,3) (2,4)
15
8 (1,1) (4,4) (3,5) (7,6) (1,7) (2,8) (3,8) (3,8) (5,7) (6,8)
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<sstream>
using namespace std;
int p[1025][1025];
int node[1025*1025];
int build(int k,int lx,int ly,int rx,int ry)
{
if(lx==rx&&ly==ry)
return node[k]=(1<<p[ly][lx]); //该块为黑色 则节点值为1, 为白色 节点值为2
int mx=(lx+rx)/2,my=(ly+ry)/2;
int v=0;
//计算四个子矩阵。或运算,如果四个子矩阵均为黑,则v=1,均为白,则为2,有黑有白则为3
//同时也放方便进行遍历。v==3的时候继续向下遍历,否则输出。
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;
}
//cout<<"123"<<endl;
void dfs(int u)
{
if(node[u]==3)
{
if(u>1)
putchar('*');
dfs(4*u);
dfs(4*u+1);
dfs(4*u+2);
dfs(4*u+3);
}
else
{
if(node[u]==2)
putchar('1');
else
putchar('0');
}
}
int main()
{
int n,lx,ly,rx,ry,m;
char str[10000];
scanf("%d",&m);
getchar();
while(m--)
{
gets(str);
stringstream sin(str);
string s;
sin>>n;
// cout<<n<<endl;
if(__builtin_popcount(n)!=1||n<=1)
{
puts("Size is invalid");
continue;
}
memset(p,0,sizeof(p));
while(sin>>s)
{
sscanf(s.c_str(),"(%d,%d)",&lx,&ly);
// cout<<lx<<" "<<ly<<endl;
if(sin>>s)
{
sscanf(s.c_str(),"(%d,%d)",&rx,&ry);
lx--,ly--,rx--,ry--;
for(int i=lx;i<=rx;i++)
for(int j=ly;j<=ry;j++)
p[j][i]=1; //白色 1 黑色 0
}
}
build(1,0,0,n-1,n-1);
dfs(1);
puts("");
}
return 0;
}
/*
3
4 (1,1) (1,1) (4,1) (4,1) (1,3) (2,4)
15
8 (1,1) (4,4) (3,5) (7,6) (1,7) (2,8) (3,8) (3,8) (5,7) (6,8)
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<sstream>
using namespace std;
int p[1025][1025];
int node[1025*1025];
int build(int k,int lx,int ly,int rx,int ry)
{
if(lx==rx&&ly==ry)
return node[k]=(1<<p[lx][ly]); //该块为黑色 则节点值为1, 为白色 节点值为2
int mx=(lx+rx)/2,my=(ly+ry)/2;
int v=0;
//计算四个子矩阵。或运算,如果四个子矩阵均为黑,则v=1,均为白,则为2,有黑有白则为3
//同时也放方便进行遍历。v==3的时候继续向下遍历,否则输出。
v|=build(k*4,lx,ly,mx,my);
v|=build(k*4+1,lx,my+1,mx,ry);
v|=build(k*4+2,mx+1,ly,rx,my);
v|=build(k*4+3,mx+1,my+1,rx,ry);
return node[k]=v;
}
//cout<<"123"<<endl;
void dfs(int u)
{
if(node[u]==3)
{
if(u>1)
putchar('*');
dfs(4*u);
dfs(4*u+1);
dfs(4*u+2);
dfs(4*u+3);
}
else
{
if(node[u]==2)
putchar('1');
else
putchar('0');
}
}
int main()
{
int n,lx,ly,rx,ry,m;
char str[5000];
scanf("%d",&m);
getchar();
while(m--)
{
gets(str);
stringstream sin(str);
string s;
sin>>n;
// cout<<n<<endl;
if(__builtin_popcount(n)!=1||n<=1)
{
puts("Size is invalid");
continue;
}
memset(p,0,sizeof(p));
while(sin>>s)
{
sscanf(s.c_str(),"(%d,%d)",&lx,&ly);
// cout<<lx<<" "<<ly<<endl;
if(sin>>s)
{
sscanf(s.c_str(),"(%d,%d)",&rx,&ry);
lx--,ly--,rx--,ry--;
for(int i=lx;i<=rx;i++)
for(int j=ly;j<=ry;j++)
p[j][i]=1; //白色 1 黑色 0
}
}
build(1,0,0,n-1,n-1);
dfs(1);
puts("");
}
return 0;
}
/*
3
4 (1,1) (1,1) (4,1) (4,1) (1,3) (2,4)
15
8 (1,1) (4,4) (3,5) (7,6) (1,7) (2,8) (3,8) (3,8) (5,7) (6,8)
*/