UVa 11948 四叉树

来源:互联网 发布:数据库工作是干什么的 编辑:程序博客网 时间:2024/06/07 08:43
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int maxn=1024;const int maxm=32767;char g[maxn][maxn],tail;char line[maxm];void build(int k,int lx,int ly,int rx,int ry){    int flag=line[tail++];    if(flag=='*')    {        int mx=(lx+rx)/2,my=(ly+ry)/2;        build(k*4+1,lx,ly,mx,my);        build(k*4+2,lx,my+1,mx,ry);        build(k*4+3,mx+1,ly,rx,my);        build(k*4+4,mx+1,my+1,rx,ry);    }    else    {        for(int i=lx;i<=rx;i++)            for(int j=ly;j<=ry;j++)                g[i][j]=flag;    }}int count(int n){    int res=0;    while(n)    {        if(n&1)            res++;        n/=2;        if(res>1)            break;    }    return res;}int main(){    int t,n;    scanf("%d",&t);    while(t--&&scanf("%d%s",&n,line)!=EOF)    {        if(count(n)!=1||n<=1)        {            printf("Invalid length\n");            continue;        }        tail=0;        build(0,1,1,n,n);        int flag=0;        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)            {                if(g[i][j]=='1')                {                    int l=j,r=j;                    while(r<=n&&g[i][r]=='1')                        r++;                    if(flag) putchar(',');                    flag=1;                    if(l+1!=r)                        printf("(%d-%d,%d)",l,r-1,i);                    else                        printf("(%d,%d)",l,i);                    j=r;                }            }        }        printf("\n");    }    return 0;}

0 0