#include #include #include #include #include #include #define SZ(x) ((int)(x).size()) using namespace std; int r,c; vector bill; int value(char c){ if ( c == 'X' ) return 1; return 0; } vector s; vector slob; int mat[257][257]; int cb; void zamjeni(int x, int y){ register int t; for ( register int i = 0; i < r * c + 1; i++){ t = mat[x][i]; mat[x][i] = mat[y][i]; mat[y][i] = t; } } void descent(int depth){ if ( depth == SZ(slob) ){ int ret = 0; for (int i = 0; i < r * c; i++){ if ( mat[i][i] == 1 ){ int t = mat[i][r * c]; for (int j = 0; j < SZ(slob); j++) if ( s[j] && mat[i][slob[j]] ) t=t^1; if ( t ) ret++; } if ( ret > cb ) break; } cb = ret; } else { s[depth] = 1; descent(depth + 1); s[depth] = 0; descent(depth + 1); } } int main(){ while(1){ scanf("%d %d\n", &r, &c); if (!r && !c) break; bill.clear(); for (int i = 0; i < r; i++){ char buff[100]; gets(buff); bill.push_back(string(buff)); } memset(mat, 0, sizeof(mat)); for (int i = 0; i < r; i++){ for (int j = 0; j < c; j++){ mat[i * c + j][r * c] = value(bill[i][j]); mat[i * c + j][i * c + j] = 1; if ( i > 0 ) mat[i * c + j][(i - 1) * c + j] = 1; if ( j > 0 ) mat[i * c + j][i * c + j - 1] = 1; if ( i + 1 < r ) mat[i * c + j][(i + 1) * c + j] = 1; if ( j + 1 < c ) mat[i * c + j][i * c + j + 1] = 1; } } for (int i = 0; i < r * c; i++){ if ( !mat[i][i] ){ for (int j = i + 1; j < r * c; j++) if ( mat[j][i] ){ zamjeni(i, j); break; } } for (int j = 0; j < r * c; j++) if ( j != i && mat[j][i] ) for (int k = 0; k < r * c + 1; k++) mat[j][k] = mat[j][k] ^ mat[i][k]; } int ret = 0; slob.clear(); for (int i = 0; i < r * c && ret != -1; i++){ if ( mat[i][r * c] ) ret++; int cnt = 0; for (int j = 0; j < r * c + 1 - 1; j++) cnt += mat[i][j]; if ( !cnt ){ slob.push_back(i); s.push_back(-1); } if ( !cnt && mat[i][r * c] ) ret = -1; } if ( ret == -1 ) { printf("Damaged billboard.\n"); continue; } cb = ret; descent(0); ret = cb; if ( ret != -1) printf("You have to tap %d tiles.\n", ret); } }