Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int NMAX = 505;
- int di[4] = {0, 0, -1, 1};
- int dj[4] = {-1, 1, 0, 0};
- queue <pair <int, int> > Q;
- int p, N, M, T, startx, starty, k, S, nr, cas, Min = 1e8;
- char binar[10];
- int H[NMAX][NMAX], Lee[NMAX][NMAX];
- bool Par[NMAX][NMAX], food[NMAX][NMAX];
- int cer_1(){
- bool ok;
- int bin, L, verf;
- for(int i=1; i<=N; i++){
- for(int j=1; j<=M; j++){
- if(i != startx || j != starty){
- ok = 1;
- bin = (H[i][j] ^ k);
- for(int i=1; i<=S; i++){
- if(bin % 2 == 0)
- ok = 0;
- bin /= 2;
- }
- if(ok){
- nr++;
- if(p == 2)
- Par[i][j] = 1;
- }
- }
- }
- }
- }
- bool OK(int i, int j){
- if(i < 1 || j < 1 || i > N || j > M)
- return false;
- if(!Par[i][j] || Lee[i][j])
- return false;
- return true;
- }
- int cer_2(){
- Q.push(make_pair(startx, starty));
- Lee[startx][starty] = 0;
- while(!Q.empty()){
- int i = Q.front().first;
- int j = Q.front().second;
- for(int d = 0; d < 4; d++){
- int i_1 = i + di[d];
- int j_1 = j + dj[d];
- if(OK(i_1, j_1) && (i_1 != startx || j_1 != starty)){
- Lee[i_1][j_1] = Lee[i][j] + 1;
- Q.push(make_pair(i_1, j_1));
- if(food[i_1][j_1]){
- if(Lee[i_1][j_1] < Min)
- Min = Lee[i_1][j_1];
- cas++;
- }
- }
- }
- Q.pop();
- }
- }
- int main(){
- freopen("panda.in", "r", stdin);
- freopen("panda.out", "w", stdout);
- scanf("%d%d%d%d%d%d%d%d", &p, &N, &M, &T, &startx, &starty, &k, &S);
- for(int i=1; i<=T; i++){
- int a, b;
- scanf("%d%d", &a, &b);
- food[a][b] = 1;
- }
- for(int i=1; i<=N; i++){
- for(int j=1; j<=M; j++){
- int x;
- scanf("%d", &x);
- H[i][j] = x;
- }
- }
- if(p == 1){
- cer_1();
- printf("%d", nr);
- } else {
- Par[startx][starty] = -1;
- cer_1();
- cer_2();
- printf("%d %d", Min, cas);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment