#include #define REP(a, b) for(int a=0; a<(b); a++) #include using namespace std; char buf[200]; char plansza[20][20]; int r, c; int dx[5] = {0, 0, 0, 1, -1}; int dy[5] = {0, 1, -1, 0, 0}; #define INF 100000 inline void przelacz(int x, int y) { REP(i, 5) if(x+dx[i]>=0 && x+dx[i]=0 && y+dy[i]=best) return INF; if (x==r-1){ REP(i, c) if (plansza[x][i]=='X') return INF; best = akt; return 0; } if (plansza[x][y]=='.') { return solve((y==c-1)?x+1:x, (y+1)%c, akt); } if(akt+1>=best) return INF; if (x==0) { int lim = 1 << c; bool ok; int cnt; int ret = INF; memcpy(store, plansza, 50); for (int i = 0; i < lim; i++) { ok = true; cnt = 0; for (int j = 0; j < c; j++) { if ((1 << j) & i) { cnt++; przelacz(0, j); } } REP(i, c) if(plansza[0][i]=='X') { przelacz(x+1, i); cnt++; } ret = min(ret, solve(1, 0, cnt)+cnt); memcpy(plansza, store, 50); } return ret; /* przelacz(x+1, y); int ret = solve((y==c-1)?x+1:x, (y+1)%c, akt+1)+1; przelacz(x+1, y); if (y!=c-1) { przelacz(x, y+1); ret = min(ret, solve((y==c-1)?x+1:x, (y+1)%c, akt+1)+1); przelacz(x, y+1); } if (y!=0) { przelacz(x, y); przelacz(x+1, y-1); ret = min(ret, solve((y==c-1)?x+1:x, (y+1)%c, akt+2)+2); przelacz(x, y); przelacz(x+1, y-1); } else { przelacz(x, y); ret = min(ret, solve((y==c-1)?x+1:x, (y+1)%c, akt+1)+1); przelacz(x, y); } return ret;*/ }else { przelacz(x+1, y); int ret = solve((y==c-1)?x+1:x, (y+1)%c, akt+1); przelacz(x+1, y); return ret+1; } } int solve2(int y) { int lim = 1 << c; bool ok; int cnt; int res = INF; memcpy(store, plansza, c); for (int i = 0; i < lim; i++) { ok = true; cnt = 0; for (int j = 0; j < c; j++) { if ((1 << j) & i) { cnt++; przelacz(0, j); } } for (int i = 0; i < c; i++) { if (plansza[0][i] != '.') { ok = false; } } if (ok) { res = min(res, cnt); } memcpy(plansza, store, c); } /* if (y==c-1){ if(plansza[0][y]=='X') return INF; return 0; } if (plansza[0][y]=='.') return solve2(y+1); przelacz(0, y+1); int ret = solve2(y+1); przelacz(0, y+1); if(y==0) { przelacz(0, 0); ret = min(ret, solve2(y+1)); przelacz(0, 0); }*/ return res; } char tmp[20][20]; int main() { while(true) { fgets(buf, 200, stdin); sscanf(buf, "%d%d", &r, &c); if(r==0 && c==0) break; REP(i, r) fgets(plansza[i], 20, stdin); if (c=INF) { printf("Damaged billboard.\n"); } else printf("You have to tap %d tiles.\n", res); }else{ best = INF; int res = solve(0, 0, 0); if (res>=INF) { printf("Damaged billboard.\n"); } else printf("You have to tap %d tiles.\n", res); } fgets(buf, 200, stdin); } return 0; }