栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 1713 Divide et unita

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 1713 Divide et unita

#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int MAX=111;char org[MAX][MAX];bool neat[MAX][MAX];int totstar=0;int N;int a[MAX][MAX],an,am;int b[MAX][MAX],bn,bm;int bit[MAX][MAX],len[MAX];int pa[MAX],pb[MAX];int press[MAX];int upleft[MAX],upright[MAX];int downleft[MAX],downright[MAX];int Vmax;const int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};bool fd=false;void out(int p[],char s[],int n,int m) {    printf("%s startn",s);    for(int i=0;i<n;i++)    {        for(int j=0;j<m;j++)        { if((1<<j)&p[i])printf("1"); else putchar('0');        }        puts("");    }    printf("%s endn",s);}int split(int r,int n,int m,int bit[]) {    int i,len=0;    for(i=0;i<m;i++) {        if(neat[r][i]) bit[len++]=i;    }    return len;}int GetState(int s,int bit[],int len) {    int ret=0;    for(int i=0;i<len;i++) {        if(s&(1<<i)) ret|=(1<<bit[i]);    }    return ret;}bool zerocol(int s[],int n,int col) {    int i;    col = 1<<col;    for(i=0;i<n;i++)        if(col&s[i])return false;    return true;}void PressState(int dest[],int src[],int n,int m,int &pn,int &pm) {    int i,j;    pn=n;    pm=m;    for(i=0;i<pn;i++)        dest[i]=src[i];    while(true) {        if(zerocol(dest,pn,0)) { for(i=0;i<pn;i++)dest[i]>>=1; pm--;        }        else break;    }    while (true) {        if(zerocol(dest,n,pm-1)) pm--;        else break;    }    while (dest[pn-1]==0)pn--;    for(j=0;dest[j]==0;j++);    for(i=0;j<pn;i++,j++)        dest[i]=dest[j];    pn=i;    while(i<Vmax) {        dest[i]=0;        i++;    }}void rot(int p[],int &n,int &m) {    int c[MAX]={0};    int i,j;    for(i=0;i<m;i++) {        int t=1<<i;        int v=0;        for(j=n-1;j>=0;j--)        { if(t&p[j])c[i]|=1<<v; v++;        }    }    for(i=0;i<Vmax;i++)p[i]=0;    for(i=0;i<m;i++)p[i]=c[i];    swap(n,m);}bool FillFull(int i,int j,int x,int y,int pa[],int pb[],   int pan,int pam,int pbn,int pbm){    int c[MAX]={0};    int t;    for(t=0;t<pan;t++)    {        c[t+i]|=pa[t]<<j;    }    for(t=0;t<pbn;t++)    {        if(c[t+x]&(pb[t]<<y))return false;        c[t+x]|=pb[t]<<y;    }    for(i=0;i<N;i++)    {        if(c[i]!=(1<<N)-1)return false;    }    return true;}bool merge(int pa[],int pb[],int pan,int pam,int pbn,int pbm){    int i,j,x,y;    for(i=0;i+pan-1<N;i++)    {        for(j=0;j+pam-1<N;j++)        { for(x=0;x+pbn-1<N;x++) {     for(y=0;y+pbm-1<N;y++)     {         if(FillFull(i,j,x,y,pa,pb,pan,pam,pbn,pbm))return true;     } }        }    }    return false;}bool ok(int x,int n){return x>=0&&x<n;}void spread(int p[],int n,int m,int x,int y){    int tx,ty;    p[x]^=1<<y;    for(int i=0;i<4;i++)    {        tx=x+dir[i][0];        ty=y+dir[i][1];        if(ok(tx,n)&&ok(ty,m)&&(p[tx]&(1<<ty)))        { spread(p,n,m,tx,ty);        }    }}bool connect(int p[],int n,int m){    int cnt=0;    for(int i=0;i<n;i++)    {        if(p[i])        { for(int j=0;j<m;j++) {     if(p[i]&(1<<j))     {         cnt++;         if(cnt>1)return false;         spread(p,n,m,i,j);     } }        }    }    return cnt==1;}bool judge(int uprow,int downrow, int n,int m){    int i,j;    int leftb=MAX,rightb=-1;    int upb=MAX,downb=-1;    bool flag=false;    if(uprow>0)    {        upb=0;        leftb=min(leftb,upleft[uprow-1]);        rightb=max(rightb,upright[uprow-1]);    }    if(downrow+1<n)    {        leftb=min(leftb,downleft[downrow+1]);        rightb=max(rightb,downright[downrow+1]);        downb=n-1;    }    if(rightb-leftb+1>N)return false;    if(downb-upb+1>N)return false;    for(i=0;i<n;i++)    {        pb[i]=press[i]^pa[i];        if(pb[i])        { upb=min(upb,i); downb=max(downb,i); for(j=0;j<N;j++) {     if(pb[i]&(1<<j))     {         rightb=max(rightb,j);         leftb=min(leftb,j);     } }        }    }    if(rightb-leftb+1>N)return false;    if(downb-upb+1>N)return false;    flag=false;    for(i=0;i<n;i++)//判B连通    {        if(flag&&pb[i]!=0)        { if((pb[i]&pb[i-1])==0)return false;        }        if(pb[i])flag=true;    }    int pressa[MAX],pressb[MAX];    int pan,pam,pbn,pbm;    PressState(pressa,pa,n,m,pan,pam);    PressState(pressb,pb,n,m,pbn,pbm);    if(!connect(pressa,pan,pam))return false;    if(!connect(pressb,pbn,pbm))return false;    PressState(pressa,pa,n,m,pan,pam);    PressState(pressb,pb,n,m,pbn,pbm);    for(int cnt=0;cnt<4;cnt++)    {        if(merge(pressa,pressb,pan,pam,pbn,pbm))return true;        rot(pressa,pan,pam);    }    return false;}void GetLeftRight(int &cleft,int &cright,int s,int m){    int i;    for(i=0;i<m;i++)    {        if(s&(1<<i))        { cleft=min(cleft,i); cright=max(cright,i);        }    }}bool DFS(int uprow,int downrow,int cleft,int cright,int n,int m,int Bleft,int Bright,bool Bflag){    if(cright-cleft+1>N)return false;    if(Bright-Bleft+1>N)return false;    if(judge(uprow,downrow,n,m))    {        fd=true;        return true;    }    downrow++;    if(downrow-uprow+1>N)return false;    int v=1<<len[downrow];    for(int i=1;i<v;i++)    {        pa[downrow]=GetState(i,bit[downrow],len[downrow]);        if((pa[downrow]&pa[downrow-1])==0)continue;        int cl=MAX,cr=-1;        GetLeftRight(cl,cr,pa[downrow],m);        cl=min(cleft,cl);        cr=max(cright,cr);        pb[downrow]=press[downrow]^pa[downrow];        bool tBflag=Bflag;        if(Bflag&&(pb[downrow]&pb[downrow-1])==0)continue;        if(pb[downrow])tBflag=true;        int tBleft=Bleft,tBright=Bright;        GetLeftRight(tBleft,tBright,pb[downrow],m);        DFS(uprow,downrow,cl,cr,n,m,tBleft,tBright,tBflag);        if(fd)return true;    }    pa[downrow]=0;    pb[downrow]=0;    return false;}void FillChar(int p[],int n,int m,int up,int left,char x){    int i,j;    for(i=0;i<n;i++)    {        for(j=0;j<m;j++)        { if((1<<j)&p[i]) {     org[up+i][left+j]=x; }        }    }}int main(){    int n,m;    int orgn=0;    int i,j;    int left=MAX,right=-1,up=MAX,down=-1;    memset(org,0,sizeof(org));    while(gets(org[orgn]))orgn++;    for(i=0;i<orgn;i++)    {        for(j=0;org[i][j];j++)        { if(org[i][j]=='*') {     if(i<up)up=i;     if(i>down)down=i;     if(j<left)left=j;     if(j>right)right=j; }        }    }    memset(neat,false,sizeof(neat));    n=down-up+1;    m=right-left+1;    totstar=0;    Vmax=max(n,m);    for(i=0;i<n;i++)    {        press[i]=0;        for(j=0;j<m;j++)        { if(org[i+up][j+left]=='*') {     neat[i][j]=true;     press[i]|=(1<<j);     totstar++; }        }    }    N=0;    while(N*N!=totstar)N++;    for(i=0;i<n;i++)    {        len[i]=split(i,n,m,bit[i]);    }    upleft[0]=bit[0][0];    upright[0]=bit[0][len[0]-1];    for(i=1;i<n;i++)    {        upleft[i]=upleft[i-1];        upright[i]=upright[i-1];        if(len[i]>0)        { upleft[i]=min(upleft[i],bit[i][0]); upright[i]=max(upright[i],bit[i][len[i]-1]);        }    }    downleft[n-1]=bit[n-1][0];    downright[n-1]=bit[n-1][len[n-1]-1];    for(i=n-2;i>=0;i--)    {        downleft[i]=downleft[i+1];        downright[i]=downright[i+1];        if(len[i]>0)        { downleft[i]=min(downleft[i],bit[i][0]); downright[i]=max(downright[i],bit[i][len[i]-1]);        }    }    bool flag=false;    fd=false;    memset(pa,0,sizeof(pa));    memset(pb,0,sizeof(pb));    for(i=0;i<n;i++)    {        int tl=len[i];        j=i+N;        if(j<n)        { if(downright[j]-downleft[j]+1>N)continue; if(i>0&&n>N)continue;        }        int Bleft=MAX,Bright=-1;        bool Bflag=false;        if(i>0)        { Bleft=upleft[i-1]; Bright=upright[i-1]; Bflag=true;        }        for(j=1;j<(1<<tl);j++)//不超过N行,l,r不超过N        { pa[i]=GetState(j,bit[i],len[i]); int cleft=MAX,cright=-1; GetLeftRight(cleft,cright,pa[i],m); pb[i]=press[i]^pa[i]; GetLeftRight(Bleft,Bright,pb[i],m); if(pb[i])Bflag=true; DFS(i,i,cleft,cright,n,m,Bleft,Bright,Bflag); if(fd)break;        }        if(fd)break;        pa[i]=0;        pb[i]=press[i];    }    FillChar(pa,n,m,up,left,'A');    FillChar(pb,n,m,up,left,'B');    for(i=0;i<orgn;i++)puts(org[i]);    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/376781.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号