#include #include #include using namespace std; int R, C; int n; int m; int stupac[20]; char mapa[16][16+1]; char a[256][257]; int hsh( int r, int c ) { return r*C + c; } int dr[5] = { 0, 1, 0, -1, 0 }; int dc[5] = { 1, 0, -1, 0, 0 }; int main( void ) { while( scanf( "%d%d", &R, &C ) == 2 ) { if( R == 0 && C == 0 ) break; n = R*C; for( int r = 0; r < R; ++r ) scanf( "%s", mapa[r] ); memset( a, 0, sizeof a ); for( int r = 0; r < R; ++r ) { for( int c = 0; c < C; ++c ) { if( mapa[r][c] == 'X' ) { a[hsh(r,c)][n] = 1; } else { a[hsh(r,c)][n] = 0; } for( int d = 0; d < 5; ++d ) { int rr = r + dr[d]; int cc = c + dc[d]; if( rr < 0 || rr >= R ) continue; if( cc < 0 || cc >= C ) continue; a[hsh(r,c)][hsh(rr,cc)] = 1; } } } int r = 0, c, i, j; m = 0; for( c = 0; c < n; ++c ) { for( i = r; i < n; ++i ) if( a[i][c] == 1 ) break; if( i == n ) { stupac[m++] = c; continue; } for( j = 0; j <= n; ++j ) swap( a[i][j], a[r][j] ); for( i = 0; i < n; ++i ) { if( i == r ) continue; if( a[i][c] == 0 ) continue; for( j = 0; j <= n; ++j ) a[i][j] ^= a[r][j]; } ++r; } int ok = 1; for( i = r; i < n; ++i ) if( a[i][n] == 1 ) ok = 0; if( !ok ) { printf( "Damaged billboard.\n" ); continue; } int ret = 1000000000; for( int mask = 0; mask < (1<>j)&1 ) ++cost; for( int i = 0; i < r; ++i ) { int parnost = a[i][n]; for( int j = 0; j < m; ++j ) if( (mask>>j)&1 ) parnost ^= a[i][stupac[j]]; if( parnost ) ++cost; } ret