1
/*
2 ID: wangzha4
3 LANG: C++
4 TASK: starry
5 */
6 /*
7 Executing
8 Test 1: TEST OK [0.000 secs, 3136 KB]
9 Test 2: TEST OK [0.011 secs, 3140 KB]
10 Test 3: TEST OK [0.022 secs, 3140 KB]
11 Test 4: TEST OK [0.011 secs, 3140 KB]
12 Test 5: TEST OK [0.000 secs, 3136 KB]
13 */
14
15 #include < stdio.h >
16 #include < stdlib.h >
17 #include < string .h >
18
19 const int INF = 999999 ;
20 const int size = 110 ;
21 char data[size][size] ;
22 int flag[size][size] ;
23 int cflag ;
24
25 char tcluster[size][size] ; int trow, tcol ;
26 char A[size][size], B[size][size] ;
27 char cluster[ 27 ][size][size] ;
28 int lenwid[ 30 ][ 2 ] ;
29
30 char flagtostr[ 3000 ] ; char str ;
31
32 int len, wid ;
33 int num ;
34
35 int next[ 9 ][ 2 ] ;
36
37 int row, col ;
38 int snrow, enrow ;
39 int sncol, encol ;
40
41 int fmax( int a, int b )
42 {
43 return a > b ? a : b ;
44 }
45 int fmin( int a, int b )
46 {
47 return a < b ? a : b ;
48 }
49
50 void input()
51 {
52 memset( flag, 0 , sizeof (flag) ) ; cflag = 1 ; str = ' a ' ;
53 memset( lenwid, 0 , sizeof (lenwid) ) ; flagtostr[ 0 ] = ' 0 ' ;
54
55 for ( int i = 0 ; i < row; i ++ ) scanf( " %s " , data[i] ) ;
56
57 next[ 1 ][ 0 ] = - 1 ; next[ 1 ][ 1 ] = - 1 ;
58 next[ 2 ][ 0 ] = - 1 ; next[ 2 ][ 1 ] = 0 ;
59 next[ 3 ][ 0 ] = - 1 ; next[ 3 ][ 1 ] = + 1 ;
60
61 next[ 4 ][ 0 ] = 0 ; next[ 4 ][ 1 ] = - 1 ;
62 next[ 5 ][ 0 ] = 0 ; next[ 5 ][ 1 ] = + 1 ;
63
64 next[ 6 ][ 0 ] = + 1 ; next[ 6 ][ 1 ] = - 1 ;
65 next[ 7 ][ 0 ] = + 1 ; next[ 7 ][ 1 ] = 0 ;
66 next[ 8 ][ 0 ] = + 1 ; next[ 8 ][ 1 ] = + 1 ;
67 }
68
69 bool in ( int r, int c )
70 {
71 if ( r >= 0 && r < row && c >= 0 && c < col ) return true ;
72
73 return false ;
74 }
75 void DFS( int r, int c )
76 {
77 snrow = fmin( snrow, r ) ; sncol = fmin( sncol, c ) ;
78 enrow = fmax( enrow, r ) ; encol = fmax( encol, c ) ;
79 flag[r][c] = cflag ; data[r][c] = ' 0 ' ;
80
81 for ( int i = 1 ; i <= 8 ; i ++ )
82 {
83 int nextr = r + next[i][ 0 ] ; int nextc = c + next[i][ 1 ] ;
84 if ( in ( nextr, nextc ) && 0 == flag[nextr][nextc] && data[nextr][nextc] != ' 0 ' )
85 DFS( nextr, nextc ) ;
86 }
87 }
88
89 bool compare( char C[][size], int len, int wid, int i )
90 {
91 for ( int r = 0 ; r <= len; r ++ ) for ( int c = 0 ; c <= wid; c ++ )
92 {
93 if ( cluster[i][r][c] != C[r][c] ) return false ;
94 }
95 return true ;
96 }
97
98 void turn90( char sour[size][size], char dest[size][size], int row, int col )
99 {
100 // memset( dest, 0, sizeof(dest) ) ;
101 for ( int i = 0 ; i < size; i ++ ) for ( int j = 0 ; j < size; j ++ ) dest[i][j] = 0 ;
102 for ( int r = 0 ; r <= row; r ++ ) for ( int c = 0 ; c <= col; c ++ )
103 dest[c][row - r] = sour[r][c] ;
104 }
105
106 void turnupdn( char sour[size][size], int row, int col )
107 {
108 char dest[size][size] ; memset( dest, 0 , sizeof (dest) ) ;
109 for ( int r = 0 ; r <= row; r ++ ) for ( int c = 0 ; c <= col; c ++ )
110 dest[row - r][c] = sour[r][c] ;
111
112 // memcpy( sour, dest, sizeof(dest) ) ;
113 for ( int r = 0 ; r < size; r ++ ) for ( int c = 0 ; c < size; c ++ )
114 sour[r][c] = dest[r][c] ;
115 }
116
117 int find( int len, int wid )
118 {
119 for ( int i = 0 ; i <= 1 ; i ++ )
120 {
121 if ( 0 == i )
122 {
123 memset( A, 0 , sizeof (A) ) ;
124 for ( int r = snrow; r <= enrow; r ++ ) for ( int c = sncol; c <= encol; c ++ )
125 {
126 if ( cflag == flag[r][c] ) A[r - snrow][c - sncol] = ' 1 ' ;
127 }
128 }
129 else
130 {
131 turn90( B, A, wid, len ) ; turnupdn( A, len, wid ) ;
132 }
133 for ( int i = 1 ; i <= num; i ++ )
134 {
135 if ( lenwid[i][ 0 ] != len || lenwid[i][ 1 ] != wid ) continue ;
136 else
137 if ( compare( A, len, wid, i ) ) return i ;
138 }
139 turn90( A, B, len, wid ) ;
140 for ( int i = 1 ; i <= num; i ++ )
141 {
142 if ( lenwid[i][ 0 ] != wid || lenwid[i][ 1 ] != len ) continue ;
143 else
144 if ( compare( B, wid, len, i ) ) return i ;
145 }
146 turn90( B, A, wid, len ) ;
147 for ( int i = 1 ; i <= num; i ++ )
148 {
149 if ( lenwid[i][ 0 ] != len || lenwid[i][ 1 ] != wid ) continue ;
150 else
151 if ( compare( A, len, wid, i ) ) return i ;
152 }
153 turn90( A, B, len, wid ) ;
154 for ( int i = 1 ; i <= num; i ++ )
155 {
156 if ( lenwid[i][ 0 ] != wid || lenwid[i][ 1 ] != len ) continue ;
157 else
158 if ( compare( B, wid, len, i ) ) return i ;
159 }
160 }
161
162 return 0 ;
163 }
164
165 void process()
166 {
167 memset( cluster, 0 , sizeof (cluster) ) ; num = 0 ;
168
169 for ( int r = 0 ; r < row; r ++ )
170 {
171 for ( int c = 0 ; c < col; c ++ )
172 {
173 if ( 0 == flag[r][c] && data[r][c] != ' 0 ' )
174 {
175 snrow = r ; enrow = r ; sncol = INF ; encol = 0 ; DFS( r, c ) ;
176
177 len = enrow - snrow ; wid = encol - sncol ;
178
179 int findnum = find( len, wid ) ;
180
181 if ( findnum != 0 )
182 {
183 flagtostr[cflag ++ ] = ' a ' - 1 + findnum ;
184 }
185 else
186 {
187 num ++ ; flagtostr[cflag] = str ++ ;
188 for ( int r = snrow; r <= enrow; r ++ ) for ( int c = sncol; c <= encol; c ++ )
189 {
190 if ( cflag == flag[r][c] ) cluster[num][r - snrow][c - sncol] = ' 1 ' ;
191 }
192
193 lenwid[num][ 0 ] = len ; lenwid[num][ 1 ] = wid ; cflag ++ ;
194 }
195 }
196 }
197 }
198 }
199
200 void output()
201 {
202 /*
203 for( int i=0; i<row; i++ )
204 {
205 for( int j=0; j<col; j++ )
206 {
207 printf( "%-3d", flag[i][j] ) ;
208 }
209 printf( "\n" ) ;
210 }
211 printf( "**************************\n" ) ;
212 */
213 for ( int i = 0 ; i < row; i ++ )
214 {
215 for ( int j = 0 ; j < col; j ++ )
216 {
217 printf( " %c " , flagtostr[flag[i][j]] ) ;
218 }
219 printf( " \n " ) ;
220 }
221 }
222
223 int main()
224 {
225 // freopen( "in.txt", "r", stdin ) ;
226 // freopen( "out.txt", "w", stdout ) ;
227 freopen( " starry.in " , " r " , stdin ) ;
228 freopen( " starry.out " , " w " , stdout ) ;
229
230 while ( scanf( " %d %d " , & col, & row ) != EOF )
231 {
232 input() ;
233
234 process() ;
235
236 output() ;
237 }
238
239 return 0 ;
240 }
2 ID: wangzha4
3 LANG: C++
4 TASK: starry
5 */
6 /*
7 Executing
8 Test 1: TEST OK [0.000 secs, 3136 KB]
9 Test 2: TEST OK [0.011 secs, 3140 KB]
10 Test 3: TEST OK [0.022 secs, 3140 KB]
11 Test 4: TEST OK [0.011 secs, 3140 KB]
12 Test 5: TEST OK [0.000 secs, 3136 KB]
13 */
14
15 #include < stdio.h >
16 #include < stdlib.h >
17 #include < string .h >
18
19 const int INF = 999999 ;
20 const int size = 110 ;
21 char data[size][size] ;
22 int flag[size][size] ;
23 int cflag ;
24
25 char tcluster[size][size] ; int trow, tcol ;
26 char A[size][size], B[size][size] ;
27 char cluster[ 27 ][size][size] ;
28 int lenwid[ 30 ][ 2 ] ;
29
30 char flagtostr[ 3000 ] ; char str ;
31
32 int len, wid ;
33 int num ;
34
35 int next[ 9 ][ 2 ] ;
36
37 int row, col ;
38 int snrow, enrow ;
39 int sncol, encol ;
40
41 int fmax( int a, int b )
42 {
43 return a > b ? a : b ;
44 }
45 int fmin( int a, int b )
46 {
47 return a < b ? a : b ;
48 }
49
50 void input()
51 {
52 memset( flag, 0 , sizeof (flag) ) ; cflag = 1 ; str = ' a ' ;
53 memset( lenwid, 0 , sizeof (lenwid) ) ; flagtostr[ 0 ] = ' 0 ' ;
54
55 for ( int i = 0 ; i < row; i ++ ) scanf( " %s " , data[i] ) ;
56
57 next[ 1 ][ 0 ] = - 1 ; next[ 1 ][ 1 ] = - 1 ;
58 next[ 2 ][ 0 ] = - 1 ; next[ 2 ][ 1 ] = 0 ;
59 next[ 3 ][ 0 ] = - 1 ; next[ 3 ][ 1 ] = + 1 ;
60
61 next[ 4 ][ 0 ] = 0 ; next[ 4 ][ 1 ] = - 1 ;
62 next[ 5 ][ 0 ] = 0 ; next[ 5 ][ 1 ] = + 1 ;
63
64 next[ 6 ][ 0 ] = + 1 ; next[ 6 ][ 1 ] = - 1 ;
65 next[ 7 ][ 0 ] = + 1 ; next[ 7 ][ 1 ] = 0 ;
66 next[ 8 ][ 0 ] = + 1 ; next[ 8 ][ 1 ] = + 1 ;
67 }
68
69 bool in ( int r, int c )
70 {
71 if ( r >= 0 && r < row && c >= 0 && c < col ) return true ;
72
73 return false ;
74 }
75 void DFS( int r, int c )
76 {
77 snrow = fmin( snrow, r ) ; sncol = fmin( sncol, c ) ;
78 enrow = fmax( enrow, r ) ; encol = fmax( encol, c ) ;
79 flag[r][c] = cflag ; data[r][c] = ' 0 ' ;
80
81 for ( int i = 1 ; i <= 8 ; i ++ )
82 {
83 int nextr = r + next[i][ 0 ] ; int nextc = c + next[i][ 1 ] ;
84 if ( in ( nextr, nextc ) && 0 == flag[nextr][nextc] && data[nextr][nextc] != ' 0 ' )
85 DFS( nextr, nextc ) ;
86 }
87 }
88
89 bool compare( char C[][size], int len, int wid, int i )
90 {
91 for ( int r = 0 ; r <= len; r ++ ) for ( int c = 0 ; c <= wid; c ++ )
92 {
93 if ( cluster[i][r][c] != C[r][c] ) return false ;
94 }
95 return true ;
96 }
97
98 void turn90( char sour[size][size], char dest[size][size], int row, int col )
99 {
100 // memset( dest, 0, sizeof(dest) ) ;
101 for ( int i = 0 ; i < size; i ++ ) for ( int j = 0 ; j < size; j ++ ) dest[i][j] = 0 ;
102 for ( int r = 0 ; r <= row; r ++ ) for ( int c = 0 ; c <= col; c ++ )
103 dest[c][row - r] = sour[r][c] ;
104 }
105
106 void turnupdn( char sour[size][size], int row, int col )
107 {
108 char dest[size][size] ; memset( dest, 0 , sizeof (dest) ) ;
109 for ( int r = 0 ; r <= row; r ++ ) for ( int c = 0 ; c <= col; c ++ )
110 dest[row - r][c] = sour[r][c] ;
111
112 // memcpy( sour, dest, sizeof(dest) ) ;
113 for ( int r = 0 ; r < size; r ++ ) for ( int c = 0 ; c < size; c ++ )
114 sour[r][c] = dest[r][c] ;
115 }
116
117 int find( int len, int wid )
118 {
119 for ( int i = 0 ; i <= 1 ; i ++ )
120 {
121 if ( 0 == i )
122 {
123 memset( A, 0 , sizeof (A) ) ;
124 for ( int r = snrow; r <= enrow; r ++ ) for ( int c = sncol; c <= encol; c ++ )
125 {
126 if ( cflag == flag[r][c] ) A[r - snrow][c - sncol] = ' 1 ' ;
127 }
128 }
129 else
130 {
131 turn90( B, A, wid, len ) ; turnupdn( A, len, wid ) ;
132 }
133 for ( int i = 1 ; i <= num; i ++ )
134 {
135 if ( lenwid[i][ 0 ] != len || lenwid[i][ 1 ] != wid ) continue ;
136 else
137 if ( compare( A, len, wid, i ) ) return i ;
138 }
139 turn90( A, B, len, wid ) ;
140 for ( int i = 1 ; i <= num; i ++ )
141 {
142 if ( lenwid[i][ 0 ] != wid || lenwid[i][ 1 ] != len ) continue ;
143 else
144 if ( compare( B, wid, len, i ) ) return i ;
145 }
146 turn90( B, A, wid, len ) ;
147 for ( int i = 1 ; i <= num; i ++ )
148 {
149 if ( lenwid[i][ 0 ] != len || lenwid[i][ 1 ] != wid ) continue ;
150 else
151 if ( compare( A, len, wid, i ) ) return i ;
152 }
153 turn90( A, B, len, wid ) ;
154 for ( int i = 1 ; i <= num; i ++ )
155 {
156 if ( lenwid[i][ 0 ] != wid || lenwid[i][ 1 ] != len ) continue ;
157 else
158 if ( compare( B, wid, len, i ) ) return i ;
159 }
160 }
161
162 return 0 ;
163 }
164
165 void process()
166 {
167 memset( cluster, 0 , sizeof (cluster) ) ; num = 0 ;
168
169 for ( int r = 0 ; r < row; r ++ )
170 {
171 for ( int c = 0 ; c < col; c ++ )
172 {
173 if ( 0 == flag[r][c] && data[r][c] != ' 0 ' )
174 {
175 snrow = r ; enrow = r ; sncol = INF ; encol = 0 ; DFS( r, c ) ;
176
177 len = enrow - snrow ; wid = encol - sncol ;
178
179 int findnum = find( len, wid ) ;
180
181 if ( findnum != 0 )
182 {
183 flagtostr[cflag ++ ] = ' a ' - 1 + findnum ;
184 }
185 else
186 {
187 num ++ ; flagtostr[cflag] = str ++ ;
188 for ( int r = snrow; r <= enrow; r ++ ) for ( int c = sncol; c <= encol; c ++ )
189 {
190 if ( cflag == flag[r][c] ) cluster[num][r - snrow][c - sncol] = ' 1 ' ;
191 }
192
193 lenwid[num][ 0 ] = len ; lenwid[num][ 1 ] = wid ; cflag ++ ;
194 }
195 }
196 }
197 }
198 }
199
200 void output()
201 {
202 /*
203 for( int i=0; i<row; i++ )
204 {
205 for( int j=0; j<col; j++ )
206 {
207 printf( "%-3d", flag[i][j] ) ;
208 }
209 printf( "\n" ) ;
210 }
211 printf( "**************************\n" ) ;
212 */
213 for ( int i = 0 ; i < row; i ++ )
214 {
215 for ( int j = 0 ; j < col; j ++ )
216 {
217 printf( " %c " , flagtostr[flag[i][j]] ) ;
218 }
219 printf( " \n " ) ;
220 }
221 }
222
223 int main()
224 {
225 // freopen( "in.txt", "r", stdin ) ;
226 // freopen( "out.txt", "w", stdout ) ;
227 freopen( " starry.in " , " r " , stdin ) ;
228 freopen( " starry.out " , " w " , stdout ) ;
229
230 while ( scanf( " %d %d " , & col, & row ) != EOF )
231 {
232 input() ;
233
234 process() ;
235
236 output() ;
237 }
238
239 return 0 ;
240 }