USACO_523 DFS

  1  /*
  2  TASK: wissqu
  3  LANG: C++
  4 
  5        Compiling
  6  Compile: OK
  7 
  8           Executing
  9           Test 1: TEST OK [3.305 secs, 2808 KB]
 10 
 11        All tests OK.
 12  */
 13  #include  < stdio.h >
 14  #include  < string .h >
 15 
 16  const   int  size  =   1000  ;
 17 
 18  char  instr[ 100 ] ;
 19  int  data[ 6 ][ 6 ] ;
 20  int  flag[ 6 ][ 6 ] ;
 21  int  cownum[ 10 ] ;
 22  int  restemp[ 4 ][ 20 ] ;
 23  int  result[ 4 ][ 20 ] ;
 24  int  resnum ;
 25 
 26  void  input()
 27  {
 28      memset( data,  0 sizeof (data) ) ;
 29      memset( cownum,  0 sizeof (cownum) ) ;
 30 
 31       for int  i = 1 ; i <= 4 ; i ++  )
 32      {
 33          scanf(  " %s " & instr ) ;
 34           for int  j = 0 ; j < 4 ; j ++  )
 35          {
 36              data[i][j + 1 =  instr[j]  -   ' A '   +   1  ;
 37              cownum[data[i][j + 1 ]] ++  ;
 38          }
 39      }
 40 
 41      cownum[ 3 ] --  ; cownum[ 4 ] ++  ;
 42  }
 43 
 44  bool  checkposi(  int  cowtype,  int  row,  int  col )
 45  {
 46       if ( row < 1   ||  row  > 4   ||  col < 1   ||  col > 4  )  return   false  ;
 47       if ( flag[row][col] )  return   false  ;
 48 
 49       if ( cowtype  ==  data[row][col] )  return   false  ;
 50       if ( cowtype  ==  data[row][col - 1 ] )  return   false  ;
 51       if ( cowtype  ==  data[row][col + 1 ] )  return   false  ;
 52 
 53       if ( cowtype  ==  data[row - 1 ][col] )  return   false  ;
 54       if ( cowtype  ==  data[row - 1 ][col - 1 ] )  return   false  ;
 55       if ( cowtype  ==  data[row - 1 ][col + 1 ] )  return   false  ;
 56 
 57       if ( cowtype  ==  data[row + 1 ][col] )  return   false  ;
 58       if ( cowtype  ==  data[row + 1 ][col - 1 ] )  return   false  ;
 59       if ( cowtype  ==  data[row + 1 ][col + 1 ] )  return   false  ;
 60 
 61       return   true  ;
 62  }
 63 
 64  void  frescpy() 
 65  {
 66       for int  i = 0 ; i <= 2 ; i ++  )
 67      {
 68           for int  j = 0 ; j <= 16 ; j ++  )
 69          {
 70              result[i][j]  =  restemp[i][j] ;
 71          }
 72      }
 73  }
 74  void  fresult()
 75  {
 76      resnum  =  resnum  +   1  ;
 77       if ( resnum  ==   1  ) memcpy( result, restemp,  sizeof (result) ) ;
 78 
 79       for int  i = 0 ; i <= 2 ; i ++  )
 80      {
 81           for int  j = 0 ; j <= 15 ; j ++  )
 82          {
 83               if ( restemp[i][j]  <  result[i][j] )
 84              {
 85                   // memcpy( result, restemp, sizeof(result) ) ;
 86                   return  ;
 87              }
 88          }
 89      }
 90  }
 91  void  DFS(  int  cowtype,  int  row,  int  col,  int  step )
 92  {
 93       // printf( "step == %d tpye = %d row=%d col=%d\n", step, cowtype, row, col ) ;
 94 
 95       if ( row < 1   ||  row  > 4   ||  col < 1   ||  col > 4  )  return  ;
 96       if ( step  >   15  )  return  ;
 97       if ( flag[row][col] )  return  ;
 98       if ( cownum[cowtype] <= 0  )  return  ;
 99       if ! checkposi( cowtype, row, col ) )  return  ;
100 
101       int  temp  =  data[row][col] ;
102      data[row][col]  =  cowtype ;
103      flag[row][col]  =   1  ;
104      cownum[cowtype] --  ;
105 
106      restemp[ 0 ][step]  =  cowtype ;
107      restemp[ 1 ][step]  =  row ;
108      restemp[ 2 ][step]  =  col ;
109 
110       // if( step >=13 )
111           // printf( "step == %d tpye = %d row=%d col=%d\n", step, cowtype, row, col ) ;
112       if ( step  ==   15  )    
113      {
114          fresult() ;
115      }
116       else
117      {
118           for int  type = 1 ; type <= 5 ; type ++  )
119          {
120               if ( cownum[type]  <=   0  )  continue  ; 
121               for int  r = 1 ; r <= 4 ; r ++  )
122              {
123                   for int  c = 1 ; c <= 4 ; c ++  )
124                  {
125                       if ( flag[r][c] )  continue  ;
126                       // for( int type=1; type<=5; type++ )
127                      {
128                           // if( cownum[type] <= 0 ) continue ;
129                          DFS( type, r, c, step + 1  ) ;
130                      }
131                  }
132              }
133          }
134      }
135 
136      data[row][col]  =  temp ;
137      flag[row][col]  =   0  ;
138      cownum[cowtype] ++  ;
139  }
140 
141  void  solve()
142  {
143      resnum  =   0  ;
144      memset( flag,  0 sizeof (flag) ) ;
145 
146       for int  i = 0 ; i <= 2 ; i ++  )  for int  j = 0 ; j <= 16 ; j ++  ) result[i][j]  =   9  ;
147 
148       for int  r = 1 ; r <= 4 ; r ++  )
149      {
150           for int  c = 1 ; c <= 4 ; c ++  )
151          {
152              DFS(  4 , r, c,  0  ) ;
153          }
154      }
155  }
156 
157  void  output()
158  {
159       for int  i = 0 ; i <= 15 ; i ++  )
160      {
161          printf(  " %c %d %d\n " , result[ 0 ][i] + ' A ' - 1 , result[ 1 ][i], result[ 2 ][i] ) ;
162      }
163      printf(  " %d\n " , resnum ) ;
164  }
165 
166  int  main()
167  {
168      freopen(  " wissqu.in " " r " , stdin ) ;
169      freopen(  " wissqu.out " , " w " ,stdout ) ;
170 
171      input() ;
172 
173      solve() ;
174 
175      output() ;
176 
177       return   0  ;
178  }
179 
180 

你可能感兴趣的:(USACO_523 DFS)