Guest User

Untitled

a guest
Jul 19th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. const int INF = 100;
  8.  
  9. int pow[10];
  10. int a[10][10];
  11. char dp[10][10][60000];
  12. char bio[10][10][60000];
  13. char f[60000][10];
  14. int n, m, cookie;
  15.  
  16. inline int modify( int s, int y, int k, int l ) { return ( s + (l-f[s][k])*pow[k] + (m-f[s][y])*pow[l] ); }
  17.  
  18. inline char min( char a, char b ) { return a < b ? a : b; }
  19.  
  20. char solve( int x, int y, int s ) {
  21.   if( y == m ) {
  22.     if( f[s][m] ) return INF;
  23.     return solve( x+1, 0, s );
  24.   }
  25.   if( x == n ) return ( s != 0 )*INF;
  26.  
  27.   if( bio[x][y][s] == cookie ) return dp[x][y][s];
  28.  
  29.   char &r = dp[x][y][s]; r = INF;
  30.   bio[x][y][s] = cookie;
  31.  
  32.   int l = f[s][m], u = f[s][y];
  33.   if( a[x][y] == 0 ) { //zid
  34.     if( l || u ) return r = INF;
  35.     return r = solve( x, y+1, modify( s, y, 0, 0 ) );
  36.   }
  37.  
  38.   if( l && u ) { //oba
  39.     if( l != u || a[x][y] > 0 ) return r = INF;
  40.     return r = solve( x+1, y, modify( s, y, 0, 0 ) );
  41.   }
  42.  
  43.   l |= u;
  44.   if( l ) { //jedan
  45.     if( a[x][y] > 0 && a[x][y] != l ) return r = INF;
  46.     if( a[x][y] > 0 ) return r = solve( x, y+1, modify( s, y, 0, 0 ) );
  47.     r = min( r, solve( x+1, y+1, modify( s, y, 0, l ) ) );
  48.     r = min( r, solve( x+1, y+1, modify( s, y, l, 0 ) ) );
  49.     return r;
  50.   }
  51.  
  52.   //nijedan
  53.   if( a[x][y] > 0 ) return r = 1+min( solve( x+1, y, modify( s, y, 0, a[x][y] ) ), solve( x, y+1, modify( s, y, a[x][y], 0 ) ) );
  54.   for( int i = 0; i < 3; ++i )
  55.     r = min( r, 2*i + solve( x+1, y, modify( s, y, i, i ) ) );
  56.   return r;
  57. }
  58.  
  59. int main( void ) {
  60.   pow[0] = 1;
  61.   for( int i = 1; i < 10; ++i ) pow[i] = pow[i-1]*3;
  62.   for( int i = 0; i < 60000; ++i )
  63.     for( int j = 0, x = i; j < 10; ++j, x /= 3 )
  64.       f[i][j] = x%3;
  65.  
  66.   while( scanf( "%d %d", &n, &m ) == 2 ) {
  67.     if( n == 0 && m == 0 ) break;
  68.    
  69.     for( int i = 0; i < n; ++i )
  70.       for( int j = 0; j < m; ++j ) {
  71.     scanf( "%d", a[i]+j );
  72.     --a[i][j];
  73.       }
  74.    
  75.     cookie++;
  76.     int r = solve( 0, 0, 0 );
  77.     if( r >= INF ) r = 0;
  78.     printf( "%d\n", r );
  79.   }
  80.   return 0;
  81. }
Add Comment
Please, Sign In to add comment