Пример #1
0
  int check_burning_wind(int** forest, int row_index, int col_index, int neighbourhood_type, int wind_speed, int wind_direction, long double pImmune,int rows, int cols)
  {
    int i=row_index;
    int j=col_index;
    int neighbour_status = -5;
    switch(wind_speed)
      {
      case 0:
	return TREE;
	break;
      case 2:
			
	switch(wind_direction)
	  {
	  case SOUTH:
	    neighbour_status = forest[Nr(Nr(i))%rows][Nc(Nc(j))%cols];
	    break;
	  case NORTH:
	    neighbour_status = forest[Sr(Sr(i))%rows][Sc(Sc(j))%cols];
	    break;
	  case EAST:
	    neighbour_status = forest[Wr(Wr(i))%rows][Wc(Wc(j))%cols];
	    break;
	  case WEST:
	    neighbour_status = forest[Er(Er(i))%rows][Ec(Ec(j))%cols];
	    break;
	  }
	if (pImmune<U && neighbour_status == BURNING)
	  return BURNING;
      case 1:
	neighbour_status = -5;
	switch(wind_direction)
	  {
	  case SOUTH:
	    neighbour_status = forest[Nr(i)][Nc(j)];
	    break;
	  case NORTH:
	    neighbour_status = forest[Sr(i)][Sc(j)];
	    break;
	  case EAST:
	    neighbour_status = forest[Wr(i)][Wc(j)];
	    break;
	  case WEST:
	    neighbour_status = forest[Er(i)][Ec(j)];
	    break;
	  }
	if (pImmune<U && neighbour_status == BURNING)
	  return BURNING;
	else
	  return TREE;	
      }
	
  }
Пример #2
0
int do_neighbours_burn(int** forest,int row_index,int col_index)
{
	return (forest[Nr(row_index)][Nc(col_index)]==BURNING ||
	    forest[Er(row_index)][Ec(col_index)]==BURNING ||
	    forest[Wr(row_index)][Wc(col_index)]==BURNING ||
	    forest[Sr(row_index)][Sc(col_index)]==BURNING
	    );
}
Пример #3
0
int main ( void ) {
    freopen ( FIN, "r", stdin ) ;

    scanf ( "%d %d %d", &N, &M, &K ) ;
    scanf ( "%d %d %d %d", &L1, &C1, &L2, &C2 ) ;
    for ( int i = 1; i <= K; ++i ) {
        scanf ( "%d %d", X + i, Y + i ) ;
    }
    int d = abs (L1 - L2) + abs (C1 - C2) ;
    int nr = Nr ( L1, C1, L2, C2 ) ;
    if ( K ) {
        int min1 = oo, nr1 = 0 ;
        for ( int i = 1; i <= K; ++i ) {
            int d2 = abs (L1 - X[i]) + abs (C1 - Y[i]) ;
            if ( d2 < min1 ) {
                min1 = d2 ;
                nr1 = Nr ( L1, C1, X[i], Y[i] ) ;
            } else if ( d2 == min1 ) {
                nr1 += Nr ( L1, C1, X[i], Y[i] ), nr1 %= MOD ;
            }
        }
        int min2 = oo, nr2 = 0 ;
        for ( int i = 1; i <= K; ++i ) {
            int d2 = abs (L2 - X[i]) + abs (C2 - Y[i]) ;
            if ( d2 < min2 ) {
                min2 = d2 ;
                nr2 = Nr ( L2, C2, X[i], Y[i] ) ;
            } else if ( d2 == min2 ) {
                nr2 += Nr ( L2, C2, X[i], Y[i] ), nr2 %= MOD ;
            }
        }
        int d2 = min1 + min2 + 1 ;
        int numar = (nr1 * nr2) % MOD ;
        if ( d2 < d ) {
            d = d2 ;
            nr = numar ;
        } else if ( d2 == d ) {
            nr += numar, nr %= MOD ;
        }
    }
    fprintf ( fopen ( FOU, "w" ) , "%d\n%d", d, nr ) ;
}
Пример #4
0
  /* This counts the number of burning neighbours */
  int count_burning_neighbours(int** forest, int row_index, int col_index, int neighbourhood_type){
    int neighbors_on_fire=0;
    int i=row_index;
    int j=col_index;

    switch(neighbourhood_type){
    case VON_NEUMANN:
      if(forest[Nr(i)][Nc(j)]>=BURNING && forest[Nr(i)][Nc(j)]<=OLD_BURNING)
	neighbors_on_fire++;
      if(forest[Er(i)][Ec(j)]>=BURNING && forest[Er(i)][Ec(j)]<=OLD_BURNING)
	neighbors_on_fire++;
      if(forest[Wr(i)][Wc(j)]>=BURNING && forest[Wr(i)][Wc(j)]<=OLD_BURNING)
	neighbors_on_fire++;
      if(forest[Sr(i)][Sc(j)]>=BURNING && forest[Sr(i)][Sc(j)]<=OLD_BURNING)
	neighbors_on_fire++;
      break;
    case MOORE:
      if(forest[Nr(i)][Nc(j)]>=BURNING && forest[Nr(i)][Nc(j)]<=OLD_BURNING)
	neighbors_on_fire++;
      if(forest[Er(i)][Ec(j)]>=BURNING && forest[Er(i)][Ec(j)]<=OLD_BURNING)
	neighbors_on_fire++;
      if(forest[Wr(i)][Wc(j)]>=BURNING && forest[Wr(i)][Wc(j)]<=OLD_BURNING)
	neighbors_on_fire++;
      if(forest[Sr(i)][Sc(j)]>=BURNING && forest[Sr(i)][Sc(j)]<=OLD_BURNING)
	neighbors_on_fire++;
      /* Diagonals */
      if(forest[NEr(i)][NEc(j)]>=BURNING && forest[NEr(i)][NEc(j)]<=OLD_BURNING)
	neighbors_on_fire++;
      if(forest[SEr(i)][SEc(j)]>=BURNING && forest[SEr(i)][SEc(j)]<=OLD_BURNING)
	neighbors_on_fire++;
      if(forest[NWr(i)][NWc(j)]>=BURNING && forest[NWr(i)][NWc(j)]<=OLD_BURNING)
	neighbors_on_fire++;
      if(forest[SWr(i)][SWc(j)]>=BURNING && forest[SWr(i)][SWc(j)]<=OLD_BURNING)
	neighbors_on_fire++;
      break;
    default:
      break;
    }
    return neighbors_on_fire;
  }
Пример #5
0
  /* This returns 1 if any neighbours burn, 0 otherwise */
  int do_neighbours_burn(int** forest, int row_index, int col_index, int neighbourhood_type){

    int i=row_index;
    int j=col_index;
  
    switch(neighbourhood_type){
    case VON_NEUMANN:
      return ((forest[Nr(i)][Nc(j)]>=BURNING &&
	       forest[Nr(i)][Nc(j)]<=OLD_BURNING) ||
	      (forest[Er(i)][Ec(j)]>=BURNING &&
	       forest[Er(i)][Ec(j)]<=OLD_BURNING) ||
	      (forest[Wr(i)][Wc(j)]>=BURNING &&
	       forest[Wr(i)][Wc(j)]<=OLD_BURNING) ||
	      (forest[Sr(i)][Sc(j)]>=BURNING &&
	       forest[Sr(i)][Sc(j)]<=OLD_BURNING)
	      );
    case MOORE:
      return ((forest[Nr(i)][Nc(j)]>=BURNING &&
	       forest[Nr(i)][Nc(j)]<=OLD_BURNING) ||
	      (forest[Er(i)][Ec(j)]>=BURNING &&
	       forest[Er(i)][Ec(j)]<=OLD_BURNING) ||
	      (forest[Wr(i)][Wc(j)]>=BURNING &&
	       forest[Wr(i)][Wc(j)]<=OLD_BURNING) ||
	      (forest[Sr(i)][Sc(j)]>=BURNING &&
	       forest[Sr(i)][Sc(j)]<=OLD_BURNING)
	      ||
	      //Diagonals
	      (forest[NEr(i)][NEc(j)]>=BURNING &&
	       forest[NEr(i)][NEc(j)]<=OLD_BURNING) ||
	      (forest[SEr(i)][SEc(j)]>=BURNING &&
	       forest[SEr(i)][SEc(j)]<=OLD_BURNING) ||
	      (forest[NWr(i)][NWc(j)]>=BURNING &&
	       forest[NWr(i)][NWc(j)]<=OLD_BURNING) ||
	      (forest[SWr(i)][SWc(j)]>=BURNING &&
	       forest[SWr(i)][SWc(j)]<=OLD_BURNING)
	      );
    default:
      return 0;
    }
  }