#include #include #include using namespace std; #define FOREACH(it,t) for(__typeof(t.begin()) it=t.begin(); it!=t.end();it++) #define FOR(q,n) for(int q=0;q PII; #define mp make_pair #define fi first #define se second char s[2*MAX]; int data[MAX]; int comb; int init(){ scanf("%d %d",&r,&c); if (r==0 && c==0) return 0; FOR(q,r) { scanf("%s",s); int t=0; FOR(w,c) t=t*2+(s[w]=='X'); data[q]=t; } comb=(1< best[2]; int xxor[MAXX]; void init__(int i,int vystup,int vystup2,int vystup3,int n){ if (i==c) { if (vystup!=0) return; PII t=mp(vystup2,vystup3); if (best[0][t]>n || best[0][t]==0) best[0][t]=n; return; } init__(i+1,vystup,vystup2,vystup3,n); init__(i+1,vystup^xxor[1< data[t] int res=it->fi.se; int res0=res; int mask=1; int cnt=0; int q=it->fi.fi; int res2=0; FOR(w,c) { if ((data[t]^q)&mask) { res^=xxor[mask]; res2^=mask; cnt+=1; } mask*=2; } // printf("%d %d from %d %d we cant transform to %d %d in %d \n", // t,data[t],q,res0,res,res2,cnt); PII t=mp(res,res2);; if ( best[noact][t]>it->se+cnt || best[noact][t]==0) best[noact][t]=it->se+cnt; } // FOR(q,comb) printf("%d ",best[noact][q]); // printf("\n"); act^=1; noact^=1; } int min=INF; FOR(q,comb) if (min>best[act][mp(data[r-1],q)] && best[act][mp(data[r-1],q)]!=0) min=best[act][mp(data[r-1],q)]; if (r==1) { min=getbestone(0,data[0],1); } if (min==INF) printf("Damaged billboard.\n"); else printf("You have to tap %d tiles.\n",min-1); } int main(){ while (init()) solve(); }