#include #include #include #include using namespace std; #define cin fin ifstream fin("frame.txt"); #define SIZE_MAX 30 int height, width; char B[SIZE_MAX][SIZE_MAX]; int rmin[26], rmax[26], cmin[26], cmax[26]; int nframe; int F[26]; int W[26]; void backtrack( int curr, int used, int order[] ) { if ( curr == nframe ) { for ( int i = 0; i < nframe; i++ ) cout << (char)('A' + order[i]); cout << endl; return; } for ( int n = 0; n < nframe; n++ ) { if ( used&(1<> height >> width; if ( height == 0 && width == 0 ) break; for ( int r = height-1; r >= 0; r-- ) for ( int c = 0; c < width; c++ ) cin >> B[r][c]; for ( int i = 0; i < 26; i++ ) rmin[i] = INT_MAX, rmax[i] = INT_MIN, cmin[i] = INT_MAX, cmax[i] = INT_MIN; for ( int r = 0; r < height; r++ ) for ( int c = 0; c < width; c++ ) { if ( B[r][c] == '.' ) continue; const int ch = B[r][c]-'A'; rmin[ch] = min(rmin[ch], r); rmax[ch] = max(rmax[ch], r); cmin[ch] = min(cmin[ch], c); cmax[ch] = max(cmax[ch], c); } nframe = 0; for ( int i = 0; i < 26; i++ ) if ( rmin[i] != INT_MAX ) F[nframe++] = i; for ( int i = 0; i < 26; i++ ) W[i] = 0; for ( int i = 0; i < nframe; i++ ) { const int self = F[i]; for ( int r = rmin[self]; r <= rmax[self]; r++ ) for ( int c = cmin[self]; c <= cmax[self]; c++ ) { if ( r > rmin[self] && r < rmax[self] && c > cmin[self] && c < cmax[self] ) continue; if ( B[r][c] == (self+'A') ) continue; const int opp = B[r][c] - 'A'; W[opp] |= (1 << self); } } compute(); } return 0; }