#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]; int bbest; void init__(int i,int vystup,int vystup2,int vystup3,int n){ if (i==c) { if (vystup!=0) return; int d[MAX]; FOR(q,r) d[q]=data[q]; d[0]=0; d[1]^=vystup2; d[2]^=vystup3; int cnt=n; for (int t=1;t 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; } 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=bbest; // 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(); }