Problem p01881 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;

struct P {
  int x, y;
  P() : x(0), y(0) {}
  P(int x, int y) : x(x), y(y) {}
};

const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};

int main() {
  int H, W;
  P s, g;
  vector<P> q, sol;
  char c;
  cin >> H >> W;
  vector<vector<int>> a(H, vector<int>(W, 1));
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      cin >> c;
      if (c == '%') {
        g.x = i, g.y = j;
      } else if (c == '@') {
        s.x = i, s.y = j;
        a[i][j] = 0;
        q.push_back(s);
      } else if (c == '$') {
        sol.push_back(P(i, j));
        a[i][j] = -1;
      } else if (c == '#') {
        a[i][j] = -1;
      }
    }
  }
  bool res = false;
  while (!q.empty()) {
    vector<P> tq, tsol;
    for (auto p : sol) {
      for (int i = 0; i < 4; i++) {
        int tx = p.x + dx[i], ty = p.y + dy[i];
        if (tx >= 0 && tx < H && ty >= 0 && ty < W && a[tx][ty] != -1) {
          a[tx][ty] = -1;
          tsol.push_back(P(tx, ty));
        }
      }
    }
    for (auto p : q) {
      for (int i = 0; i < 4; i++) {
        int tx = p.x + dx[i], ty = p.y + dy[i];
        if (tx >= 0 && tx < H && ty >= 0 && ty < W && a[tx][ty] == 1) {
          if (tx == g.x && ty == g.y) {
            res = true;
            tq.clear();
            break;
          }
          a[tx][ty] = 0;
          tq.push_back(P(tx, ty));
        }
      }
    }
    q = tq, sol = tsol;
  }
  cout << (res ? "Yes" : "No") << endl;
  return 0;
}

Error: TLE

Fixed submission:

// #include <iostream>
// #include <cstdio>
// #include <cstdlib>
// #include <cstring>
// #include <cmath>
// #include <string>
// #include <algorithm>
// #include <functional>
// #include <set>
// #include <map>
// #include <queue>
// #include <stack>
// #include <vector>
//
// using namespace std;
// const int maxn = 1000;
// int k, sx, sy, ex, ey;
// int vis[maxn][maxn];
// int dirt[4][2] = {1,0,0,1,-1,0,0,-1};
// struct node{
//     int x, y, step;
// };
//
// int judge(int x, int y)
//{
//     if(x < 0 || x >= h || y < 0 || y >= w)
//         return 1 ;
//     return vis[x][y];
// }
//
// void bfs()
//{
//
//     queue<node>q;
//     node a, b, next;
//     a.x = sx;
//     a.y = sy;
//     a.step = 0;
//     q.push(a);
//     vis[sx][sy] = 1;
//     while(!q.empty()){
//         b = q.front();
//         q.pop();
//         if(b.x == ex && b.y == ey){
//             k = b.step;
//             return;
//         }
//         for(int i = 0 ; i < 8 ; i++){
//         next.x = b.x + dirt[i][0];
//         next.y = b.y + dirt[i][1];
//         if(judge(next.x, next.y)) continue;
//         next.step = b.step + 1;
//         q.push(next);
//         vis[next.x][next.y] = 1;
//         }
//     }
// }
//
// int main()
//{
//     char y1, y2, y3, y4;
//     while(~scanf("%c%c %c%c",&y1,&y2,&y3,&y4)){
//     k = 0 ;
//     memset(vis , 0 , sizeof(vis));
//     sx = y1 - 'a' , sy = y2 - '1';
//     ex = y3 - 'a' , ey = y4 - '1';
//     bfs();
//     printf("To get from %c%c to %c%c takes %d knight moves.\\n",
//     y1,y2,y3,y4,k); getchar();
//     }
//     return 0;
// }

#include <algorithm>
#include <iostream>
#include <queue>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn = 202;
int dirt[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};
int sx, sy;
int ex, ey;
int h, w, k;
char mapp[maxn][maxn];
int vis[maxn][maxn];
struct node {
  int x, y, step;
};
bool judge1(int x, int y) {
  if (x >= 0 && x < h && y >= 0 && y < w && mapp[x][y] != '#' &&
      mapp[x][y] != '$' && vis[x][y] == 0)
    return 1;
  return 0;
}

bool judge2(int x, int y) {
  if (x >= 0 && x < h && y >= 0 && y < w && mapp[x][y] != '#' && vis[x][y] == 0)
    return 1;
  return 0;
}

int bfs1(int x, int y) {

  queue<node> q;
  node a, b, next;
  a.x = x;
  a.y = y;
  a.step = 0;
  q.push(a);
  vis[x][y] = 1;
  while (!q.empty()) {
    b = q.front();
    q.pop();
    if (b.x == ex && b.y == ey) {
      return b.step;
    }
    for (int i = 0; i < 4; i++) {
      next.x = b.x + dirt[i][0];
      next.y = b.y + dirt[i][1];
      if (!judge1(next.x, next.y))
        continue;
      next.step = b.step + 1;
      q.push(next);
      vis[next.x][next.y] = 1;
    }
  }
  return 10000;
}

int bfs2(int x, int y) {

  queue<node> q;
  node a, b, next;
  a.x = x;
  a.y = y;
  a.step = 0;
  q.push(a);
  vis[x][y] = 1;
  while (!q.empty()) {
    b = q.front();
    q.pop();
    if (b.x == ex && b.y == ey) {
      return b.step;
    }
    for (int i = 0; i < 4; i++) {
      next.x = b.x + dirt[i][0];
      next.y = b.y + dirt[i][1];
      if (!judge2(next.x, next.y))
        continue;
      next.step = b.step + 1;
      q.push(next);
      vis[next.x][next.y] = 1;
    }
  }
  return 10000;
}
int main() {
  while (scanf("%d%d", &h, &w) != EOF) {
    memset(vis, 0, sizeof(vis));
    for (int i = 0; i < h; i++) {
      for (int j = 0; j < w; j++) {
        cin >> mapp[i][j];
        if (mapp[i][j] == '@') {
          sx = i;
          sy = j;
        }
        if (mapp[i][j] == '%') {
          ex = i;
          ey = j;
        }
      }
    }
    int maxx = 10000;
    for (int i = 0; i < h; i++) {
      for (int j = 0; j < w; j++) {
        memset(vis, 0, sizeof(vis));
        if (mapp[i][j] == '$')
          maxx = min(maxx, bfs2(i, j));
      }
    }
    memset(vis, 0, sizeof(vis));
    k = bfs1(sx, sy);
    // cout << k << endl;
    if (k == 10000) {
      cout << "No" << endl;
      continue;
    }
    if (k >= maxx)
      cout << "No" << endl;
    else
      cout << "Yes" << endl;
  }
  return 0;
}