Problem - D - Codeforces
你正在玩一款电脑游戏。其中一个关卡将你置于一个迷宫中,它由n行构成,每行包含m个单元格。每个单元格要么是空闲的,要么被障碍物占据。起始单元格位于第r行和第c列。在一步中,如果目标单元格没有被障碍物占据,您可以向上、左、下或右移动一个方格。您不能越过迷宫的边界。
不幸的是,您的键盘即将损坏,因此您可以向左移动不超过x次,向右移动不超过y次。由于用于向上和向下移动的键处于完好状态,因此对向上和向下移动的步数没有限制。
现在,您想确定对于每个单元格,是否存在一系列移动,可以将您从起始单元格移动到该特定单元格。有多少个单元格具有这种属性?
输入 第一行包含两个整数n、m(1 ≤ n,m ≤ 2000)——迷宫中的行数和列数。
第二行包含两个整数r、c(1 ≤ r ≤ n,1 ≤ c ≤ m)——定义起始单元格的行索引和列索引。
第三行包含两个整数x、y(0 ≤ x,y ≤ 109)——允许向左和向右移动的最大次数。
接下来的n行描述了迷宫。每一行都有m个字符,只有符号'.'和''。第i行第j个字符对应迷宫中位于第i行和第j列的单元格。符号'.'表示空闲单元格,而符号''表示带障碍物的单元格。
保证起始单元格不包含障碍物。
输出 准确输出一个整数——可以从起始单元格到达的迷宫单元格数量,包括起始单元格本身。
Examples
input
Copy
4 5 3 2 1 2 ..... .***. ...** *....
output
Copy
10
input
Copy
4 4 2 2 0 1 .... ..*. .... ....
output
Copy
7
题解:
好长时间没写双端队列BFS,没有想到用双端队列去优化,
对于没有限制的条件,肯定让其先走,对于有限制的条件,让没有限制的走完再继续走,双端队列BFS的核心思想
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
#define int long long
typedef pair<int,int> PII;
int mod = 1e9 + 7;
int n,m,sx,sy,x,y;
char a[2005][2005];
int vis[2005][2005];
int dx[4] = {0,0,1,-1};
int dy[4] = {-1,1,0,0};
struct node
{
int tx,ty,x,y;
};
void solve()
{
cin >> n >> m;
cin >> sx >> sy >> x >> y;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
cin >> a[i][j];
}
}
deque<node> q;
vis[sx][sy] = 1;
q.push_front({sx,sy,x,y});
while(q.size())
{
node t = q.front();
q.pop_front();
for(int i = 0;i < 4;i++)
{
int tx = t.tx + dx[i];
int ty = t.ty + dy[i];
if(i == 0&&!t.x)
{
continue;
}
if(i == 1&&!t.y)
{
continue;
}
if(tx >= 1&&tx <= n&&ty >= 1&&ty <= m&&a[tx][ty] == '.'&&!vis[tx][ty])
{
vis[tx][ty] = 1;
if(i == 0)
{
q.push_back({tx,ty,t.x - 1,t.y});
}
else if(i == 1)
{
q.push_back({tx,ty,t.x,t.y - 1});
}
else
{
q.push_front({tx,ty,t.x,t.y});
}
}
}
}
int cnt = 0;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
if(vis[i][j])
cnt++;
}
}
cout << cnt;
}
signed main()
{
// ios::sync_with_stdio(0 );
// cin.tie(0);cout.tie(0);
int t = 1;
// cin >> t;
while(t--)
{
solve();
}
}