#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
//英语 抄博友程序 百练上有翻译 bfs 四叉树 背
struct nod{
int x1,y1,x2,y2;
};
int da[550][550];
int ans[2000000];
int main()
{
int T;
cin>>T;
while(T--)
{
memset(da,0,sizeof(da));
int n;
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>da[i][j];
}
}
int cnt=0;
queue<nod> que;
que.push((nod){0,0,n-1,n-1});
while(que.empty()!=1)
{
nod t=que.front();
que.pop();
int x1=t.x1;
int y1=t.y1;
int x2=t.x2;
int y2=t.y2;
//cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<endl;
if(x1>x2||y1>y2)
{
continue;
}
if(x2>=n||y2>=n)
{
continue;
}
int f0=0;
int f1=0;
for(int i=x1;i<=x2;i++)
{
for(int j=y1;j<=y2;j++)
{
if(da[i][j]==0)
{
f0=1;
}
if(da[i][j]==1)
{
f1=1;
}
}
}
if(f0^f1==0)
{
ans[cnt++]=1;
}else
{
if(f0==1)
{
ans[cnt++]=0;
ans[cnt++]=0;
}else
{
ans[cnt++]=0;
ans[cnt++]=1;
}
continue;
}
int mx=(x1+x2)/2;
int my=(y1+y2)/2;
que.push((nod){x1,y1,mx,my});
que.push((nod){x1,my+1,mx,y2});
que.push((nod){mx+1,y1,x2,my});
que.push((nod){mx+1,my+1,x2,y2});
}
int tn=cnt%4;
int z=0;
for(int i=0;i<tn;i++)
{
z=z*2+ans[i];
}
//cout<<z;
printf("%X",z);//抄博友程序
z=0;
for(int i=tn;i<cnt;i++)
{
z=z*2+ans[i];
if((i-tn)%4==3)
{
//cout<<z;
printf("%X",z);
z=0;
}
}
cout<<endl;
}
return 0;
}
POJ 1610 Quad Trees G++ bfs 四叉树 背
最新推荐文章于 2020-11-18 20:43:27 发布