题意
给你一个N*M的图,起点为(r,c),只能往左走X步,往右走Y步,上下无限制。问可以有多少个点可以到达?
思路
第一次听说01BFS。当时写的时候直接BFS,结果PP了,感觉貌似有问题,但是没管,果然就FST了。。。
01BFS其实就是把队列开成双端队列,每次花费为1走到的点还是放在后面,花费为0走到的点放在队首。每次取队首元素进行更新。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e3 + 5;
typedef long long LL;
int n, m;
char MAP[MAXN][MAXN];
bool vis[MAXN][MAXN];
struct Node
{
int x, y, l, r;
Node(int x, int y, int l, int r) : x(x), y(y), l(l), r(r) {}
};
const int dx[] = {0, 0, 1, -1};
const int dy[] = {-1, 1, 0, 0};
int BFS(int sx, int sy, int L, int R)
{
memset(vis, 0, sizeof(vis));
int ans = 0;
deque<Node> Q;
vis[sx][sy] = true;
Q.push_front(Node(sx, sy, 0, 0));
while (!Q.empty())
{
Node u = Q.front();
Q.pop_front();
ans++;
for (int i = 0; i < 4; i++)
{
int xx = u.x + dx[i], yy = u.y + dy[i], l = u.l + (i == 0), r = u.r + (i == 1);
if (xx < 0 || yy < 0 || xx >= n || yy >= m || MAP[xx][yy] == '*' || vis[xx][yy])
continue;
if (l > L || r > R)
continue;
vis[xx][yy] = true;
Node v(xx, yy, l, r);
if (i <= 1)
Q.push_back(v);
else
Q.push_front(v);
}
}
return ans;
}
int main()
{
scanf("%d%d", &n, &m);
int sx, sy, X, Y;
scanf("%d%d%d%d", &sx, &sy, &X, &Y);
sx--, sy--;
for (int i = 0; i < n; i++)
scanf("%s", MAP[i]);
int ans = BFS(sx, sy, X, Y);
printf("%d\n", ans);
return 0;
}
/*
4 5
3 2
1 2
.....
.***.
...**
*....
*/