#include #define MAX 63 char graf[ MAX ][ MAX ][ MAX ]; int componenty ; int V, R, S; long cena; void spoj( int f1, int f2 ) { int i, j, k; if ( f1 == f2 ) return; for ( i = 0; i < V; i++ ) { for ( j = 0; j < R; j++ ) { for ( k = 0; k < R; k++ ) { if ( graf[ i ][ j ][ k ] == f2 ) graf[ i ][ j ][ k ] = f1; } } } componenty--; } void spoj2( int f1, int f2, int pos ) { int i, j, k; if ( f1 == f2 ) return; for ( i = 0; i <= pos; i++ ) { for ( j = 0; j < R; j++ ) { for ( k = 0; k < R; k++ ) { if ( graf[ i ][ j ][ k ] == f2 ) graf[ i ][ j ][ k ] = f1; } } } componenty--; } void vypocitajceny( void ) { int i, j, k; cena = 0; for ( i = 0; i < V; i++ ) { for ( j = 0; j < R; j ++ ) { for ( k = 1; k < S; k++ ) if ( graf[ i ][ j ][ k - 1] != graf[ i ][ j ][ k] ) { spoj( graf[ i ][ j ][ k - 1 ], graf[ i ][ j ][ k ] ); cena += 1000; if ( componenty == 1 ) return; } if ( j ) { if ( graf[ i ][ j - 1 ][ 0 ] != graf[ i ][ j ][ 0 ] ) { spoj( graf[ i ][ j - 1 ][ 0 ], graf[ i ][ j ][ 0 ] ); cena += 1000; if ( componenty == 1 ) return; } } } } for ( i = 1; i < V; i++ ) { if ( graf[ i - 1 ][ 0 ][ 0 ] != graf[ i ][ 0 ][ 0 ] ) { spoj( graf[ i - 1 ][ 0 ][ 0 ], graf[ i ][ 0 ][ 0 ] ); cena += 2000; } } } void nacstlpec( int pos, int riad ) { char riadok[ MAX * 2 + 10 ]; int j; gets(riadok ); for ( j = 0; j < S; j++ ) { if ( ( riadok[ 2 * j ] == '|' ) && ( graf[ pos ][ riad ][ j ] != graf[ pos ][ riad - 1 ][ j ] ) ) { componenty--; graf[ pos ][ riad ][ j ] = graf[ pos ][ riad - 1 ][ j ] ; /* spoj2( graf[ pos ][ riad - 1 ][ j ], graf[ pos ][ riad ][ j ], pos ); */ } } } void nacriadok( int pos, int riad ) { char riadok[ MAX * 2 + 10 ]; int j; gets(riadok ); for ( j = 1; j < S; j++ ) { if ( riadok[ 2 * j - 1] == '-' ) { if ( riad && ( graf[ pos ][ riad ][ j ] != graf[ pos ][ riad - 1 ][ j ] ) ) { componenty--; graf[ pos ][ riad ][ j ] = graf[ pos ][ riad ][ j - 1]; } else spoj2( graf[ pos ][ riad ][ j - 1 ], graf[ pos ][ riad ][ j ], pos ); } } } void nacposchodie( int pos ) { int i; nacriadok( pos, 0 ); for ( i = 1; i < R; i++ ) { nacstlpec( pos, i ); nacriadok( pos, i ); } nacstlpec( pos, i ); } void nacmedziposchodie( int pos ) { char riadok[ MAX * 2 + 10 ]; int i, j; for ( i = 0; i < R; i++ ) { gets(riadok ); for ( j = 0; j < S; j++ ) { if ( riadok[ 2 * j ] == 'o' ) { spoj2( graf[ pos - 1 ][ i ][ j ], graf[ pos ][ i ][ j ], pos ); } } gets(riadok ); } } int main( void ) { int i, j, k; while ( 1 ) { V = 0; scanf( "%d %d %d\n", &V, &R, &S ); if ( !V ) { return 0; } componenty = V * R * S; for( i = 0; i < V; i++ ) { for ( j = 0; j < R; j++ ) { for ( k = 0; k < S; k++ ) { graf[ i ][ j ][ k ] = i * MAX * MAX + j * MAX + k; } } } nacposchodie( 0 ); for ( i = 1; i < V; i++ ) { nacmedziposchodie( i ); nacposchodie( i ); } if ( componenty == 1 ) { printf( "Budova je jiz dostatecne propojena." ); } else { vypocitajceny(); printf( "Ocekavana cena: %ld Kc\n", cena ); } } }