CF1063B Labyrinth
大家一起膜Rorshach。
一般的$bfs$会造成有一些点访问不到的情况,在$system\ test$的时候会$WA40$(比如我……)。
发现这张地图其实是一个边权只有$0/1$的图,我们需要计算的是从$(r, c)$开始到每一个点的最短路,因为边权只有两种的特性,我们可以用一个双端队列,每一次向上向下走的放在队首,每一次向左向右走放在队尾,就可以得到正确的解。
也可以用优先队列,这样子多一个$log$。
时间复杂度$O(n^2)$。
Code:
#include <cstdio> #include <cstring> #include <deque> #include <iostream> using namespace std; const int N = 2005; const int dx[] = {0, 1, 0, -1}; const int dy[] = {1, 0, -1, 0}; int n, m, r, c, lstp, rstp, ans = 0; bool vis[N][N]; char mp[N][N]; struct Node { int x, y, ls, rs; inline Node(int nowX = 0, int nowY = 0, int nowLs = 0, int nowRs = 0) { x = nowX, y = nowY, ls = nowLs, rs = nowRs; } }; deque <Node> Q; inline bool valid(Node now) { return now.x >= 1 && now.x <= n && now.y >= 1 && now.y <= m && mp[now.x][now.y] != '*' && !vis[now.x][now.y]; } void bfs() { Q.push_front(Node(r, c, lstp, rstp)); vis[r][c] = 1, ++ans; for(; !Q.empty(); ) { Node out = Q.front(); Q.pop_front(); for(int i = 0; i < 4; i++) { Node in = Node(out.x + dx[i], out.y + dy[i], out.ls - (dy[i] == -1), out.rs - (dy[i] == 1)); if(!valid(in)) continue; if(in.ls == -1 || in.rs == -1) continue; if(i == 0 || i == 2) Q.push_back(in); else Q.push_front(in); vis[in.x][in.y] = 1, ++ans; } } } int main() { scanf("%d%d%d%d%d%d", &n, &m, &r, &c, &lstp, &rstp); for(int i = 1; i <= n; i++) scanf("%s", mp[i] + 1); bfs(); /* for(int i = 1; i <= n; i++, printf("\n")) for(int j = 1; j <= m; j++) printf("%d ", vis[i][j]); */ printf("%d\n", ans); return 0; }