Esempio n. 1
0
int		down(int ***tab)
{
	int		i;

	i = 0;
	while (move_down(tab, &i) == 1)
		;
	while (add_down(tab, &i) == 1)
		;
	while (move_down(tab, &i) == 1)
		;
	return (i);
}
Esempio n. 2
0
int main()
{
  std::ifstream fin("castle.in", std::ios::in);
  
  fin>>M>>N;

  for( int i = 0; i < M * N; ++i ) fin >> room[i];

  for( int i = 0; i < M * N; ++i ) room_state[i] = 0;
  
#if 0
  for( int i = 0; i < M * N; ++i ) {
    std::cout << room[i];
    if( i % M == M-1 ) std::cout << std::endl;
    else std::cout << " ";
  }
    std::cout << M << " " << N << " "
	    <<  M * N << std::endl;
#endif

  for( int i = 0; i < M * N; ++i ){
    if( room_state[i] == 0 ){
      int temp_max_count = 0;
      q.push( i );
      while( !q.empty() ){
	int index = q.front();
	temp_max_count++;
	room_state[index] = count;
	q.pop();
#if 0
	std::cout << count << ":" << index/M + 1 << " " << index % M + 1 << std::endl;
#endif
	switch( room[index] ){
	case 0:
	  add_left( index );
	  add_up( index );
	  add_right( index );
	  add_down( index );
	  break;
	case 1:
	  {
	    add_left_edge( index );
	    add_up( index );
	    add_right( index );
	    add_down( index );
	  }
	  break;
	case 2:
	  {
	    add_left( index );
	    add_up_edge( index );
	    add_right( index );
	    add_down( index );
	  }
	  break;
	case 3:
	  {
	    add_left_edge( index );
	    add_up_edge( index );
	    add_right( index );
	    add_down( index );
	  }
	  break;
	case 4:
	  {
	    add_left( index );
	    add_up( index );
	    add_right_edge( index );
	    add_down( index );
	  }
	  break;
	case 5:
	  {
	    add_left_edge( index );
	    add_up( index );
	    add_right_edge( index );
	    add_down( index );
	  }
	  break;
	case 6:
	  {
	    add_left( index );
	    add_up_edge( index );
	    add_right_edge( index );
	    add_down( index );
	  } 
	  break;
	case 7:
  	  {
	    add_left_edge( index );
	    add_up_edge( index );
	    add_right_edge( index );
	    add_down( index );
	  } 
	  break;
	case 8:
  	  {
	    add_left( index );
	    add_up( index );
	    add_right( index );
	    add_down_edge( index );
	  } 
	  break;
	case 9:
	  {
	    add_left_edge( index );
	    add_up( index );
	    add_right( index );
	    add_down_edge( index );
	  } 
	  break;
	case 10:
	  {
	    add_left( index );
	    add_up_edge( index );
	    add_right( index );
	    add_down_edge( index );
	  } 
	  break;
	case 11:
	  {
	    add_left_edge( index );
	    add_up_edge( index );
	    add_right( index );
	    add_down_edge( index );
	  } 
	  break;
	case 12:
	  {
	    add_left( index );
	    add_up( index );
	    add_right_edge( index );
	    add_down_edge( index );
	  } 
	  break;
	case 13:
	  {
	    add_left_edge( index );
	    add_up( index );
	    add_right_edge( index );
	    add_down_edge( index );
	  } 
	  break;
	case 14:
	  {
	    add_left( index );
	    add_up_edge( index );
	    add_right_edge( index );
	    add_down_edge( index );
	  } 
	  break;
	case 15:
	  {
	    add_left_edge( index );
	    add_up_edge( index );
	    add_right_edge( index );
	    add_down_edge( index );
	  }
	  break;
	default:
	  break;
	}
      }
      room_num[count] = temp_max_count;
      max_count = std::max( max_count, temp_max_count );
      count++;
    }
  }
  std::ofstream fout("castle.out", std::ios::out );
#if 0
  std::cout << count - 1 << std::endl;
  std::cout << max_count << std::endl;
#endif
  fout << count - 1 << std::endl;
  fout << max_count << std::endl;
  int a, b, c;
  a = N;
  b = M;
  c = 4;
  
  for( int i = 0; i < edge_count; ++i ){
#if 0
    std::cout << edge1[i] / M  + 1 << ":" << edge1[i] % M + 1 << " "
	      << edge2[i] / M  + 1 << ":" << edge2[i] %M + 1 << std::endl;
#endif
    if( room_state[edge1[i]] != room_state[edge2[i]] ){
      if( new_max_count < room_num[room_state[edge1[i]]] + room_num[room_state[edge2[i]]] ){
	new_max_count = room_num[room_state[edge1[i]]] + room_num[room_state[edge2[i]]];
	if( abs( edge2[i] - edge1[i] ) == 1 ) {
	  int temp = std::min( edge1[i], edge2[i] );
	  a = temp / M + 1;
	  b = temp % M + 1;
	  c = 4;
	}else{
	  int temp = std::max( edge1[i], edge2[i] );
	  a = temp / M + 1;
	  b = temp % M + 1;
	  c = 2;
	}
      }else if( new_max_count == room_num[room_state[edge1[i]]] + room_num[room_state[edge2[i]]] ) {
	if( abs( edge1[i] - edge2[i] ) == 1 ){
	  int temp = std::min( edge1[i], edge2[i] );
	  if( temp % M + 1< b || (temp % M + 1 == b && temp / M + 1 > a)){
	    a = temp / M + 1;
	    b = temp % M + 1;
	    c = 4;
	  }
	}else {
	  int temp = std::max( edge1[i], edge2[i] );
	  if( temp % M + 1 < b || ( temp % M + 1 == b && temp / M + 1 > a ) ){
	    a = temp / M + 1;
	    b = temp % M + 1;
	    c = 2;
	  }
	}
	    
      }
      //      new_max_count = std::max( new_max_count,
      //			room_num[room_state[edge1[i]]] + room_num[room_state[edge2[i]]] );
#if 0
      std::cout << room_num[room_state[edge1[i]]] << ":" << room_num[room_state[edge2[i]]] << " " << new_max_count << std::endl;
      std::cout << a << " " << b << " " << c << std::endl;
#endif
    }
    
  }

  fout << new_max_count << std::endl;
  fout << a  << " "<< b << " "<< (c == 2? 'N' : 'E') << std::endl;
  return 0;
}