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; } }
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 ); }
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 ) ; }
/* 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; }
/* 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; } }