#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; vector > mat; int cb; void descent(int depth){ if ( depth == SZ(slob) ){ int ret = 0; for (int i = 0; i < SZ(mat); 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)); } mat.clear(); for (int i = 0; i < r; i++){ for (int j = 0; j < c; j++){ vector red(r * c + 1, 0); red[r * c] = value(bill[i][j]); red[i * c + j] = 1; if ( i > 0 ) red[(i - 1) * c + j] = 1; if ( j > 0 ) red[i * c + j - 1] = 1; if ( i + 1 < r ) red[(i + 1) * c + j] = 1; if ( j + 1 < c ) red[i * c + j + 1] = 1; mat.push_back(red); } } for (int i = 0; i < SZ(mat); i++){ if ( !mat[i][i] ){ for (int j = i + 1; j < SZ(mat); j++) if ( mat[j][i] ){ swap(mat[i], mat[j]); break; } } for (int j = 0; j < SZ(mat); j++) if ( j != i && mat[j][i] ) for (int k = 0; k < SZ(mat[j]); k++) mat[j][k] = mat[j][k] ^ mat[i][k]; } int ret = 0; slob.clear(); for (int i = 0; i < SZ(mat) && ret != -1; i++){ if ( mat[i][r * c] ) ret++; int cnt = 0; for (int j = 0; j < SZ(mat[i]) - 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); } }