You are playing some computer game. One of its levels puts you in a maze consisting of n lines, each of which contains m cells. Each cell either is free or is occupied by an obstacle. The starting cell is in the row r and column c. In one step you can move one square up, left, down or right, if the target cell is not occupied by an obstacle. You can't move beyond the boundaries of the labyrinth.

Unfortunately, your keyboard is about to break, so you can move left no more than x times and move right no more than y times. There are no restrictions on the number of moves up and down since the keys used to move up and down are in perfect condition.

Now you would like to determine for each cell whether there exists a sequence of moves that will put you from the starting cell to this particular one. How many cells of the board have this property?

Input

The first line contains two integers n, m (1 ≤ n, m ≤ 2000) — the number of rows and the number columns in the labyrinth respectively.

The second line contains two integers r, c (1 ≤ r ≤ n, 1 ≤ c ≤ m) — index of the row and index of the column that define the starting cell.

The third line contains two integers x, y (0 ≤ x, y ≤ 109) — the maximum allowed number of movements to the left and to the right respectively.

The next n lines describe the labyrinth. Each of them has length of m and consists only of symbols '.' and '*'. The j-th character of the i-th line corresponds to the cell of labyrinth at row i and column j. Symbol '.' denotes the free cell, while symbol '*' denotes the cell with an obstacle.

It is guaranteed, that the starting cell contains no obstacles.

Output

Print exactly one integer — the number of cells in the labyrinth, which are reachable from starting cell, including the starting cell itself.

Examples
Input

Copy
4 5
3 2
1 2
.....
.***.
...**
*....
Output

Copy
10
Input

Copy
4 4
2 2
0 1
....
..*.
....
....
Output

Copy
7
Note

Cells, reachable in the corresponding example, are marked with '+'.

First example:

+++..
+***.
+++**
*+++.

Second example:

.++.
.+*.
.++.
.++. 题意 : 给你一个n*m 的矩阵,再给你一个起点,你可以往上下左右四个方向走,但同时又有一个往左右的步数限制,询问所有可能到达的点数有多少个?
思路分析 :
  比赛场上直接写了一个 bfs ,pp 了,自信以为A了,今晚又可以涨分,结果....
  其实有一点贪心的想法,就是可以上下走的时候一定要先上下走,最后再左右走,用一个双端队列即可
代码示例:
int n, m;
int sx, sy;
int sl, sr; char mp[2005][2005];
struct node
{
int x, y;
int l, r;
};
deque<node>que;
bool vis[2005][2005]; int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1}; void bfs(){
que.push_front({sx, sy, sl, sr});
int ans = 0;
//vis[sx][sy] = 1; while(!que.empty()){
node v = que.front(); que.pop_front();
if (vis[v.x][v.y]) continue;
vis[v.x][v.y] = true;
ans++;
for(int i = 0; i < 4; i++){
int fx = v.x+dir[i][0];
int fy = v.y+dir[i][1];
if (fx < 1 || fx > n || fy < 1 || fy > m || mp[fx][fy] == '*'||vis[fx][fy]) continue; if (i == 2) {
if (v.r > 0) que.push_back({fx, fy, v.l, v.r-1});
}
else if (i == 3) {
if (v.l > 0) que.push_back({fx, fy, v.l-1, v.r});
}
else que.push_front({fx, fy, v.l, v.r});
}
}
printf("%d\n", ans);
} int main() {
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
cin >> n >> m;
cin >> sx >> sy;
cin >> sl >> sr;
for(int i = 1; i <= n; i++){
scanf("%s", mp[i]+1);
}
bfs();
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(mp[i][j] == '*') printf("*");
else if (vis[i][j]) printf("+");
else printf(".");
}
printf("\n");
}
return 0;
}

2 . 用类似最短路的写法,每次左右走的时候步数+1,上下走的时候步数不变

代码示例:

const int inf = 0x3f3f3f3f;

int n, m;
int sx, sy, sl, sr;
char mp[2005][2005];
struct node
{
int x, y;
int l, r;
int sum;
bool operator< (const node &v)const{
return sum < v.sum;
}
};
priority_queue<node>que;
bool vis[2005][2005];
int bu[2005][2005];
int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1}; void bfs() {
que.push({sx, sy, sl, sr, sl+sr});
memset(vis, false, sizeof(vis));
memset(bu, inf, sizeof(bu));
int ans = 0;
bu[sx][sy] = 0; while(!que.empty()){
node v = que.top(); que.pop(); if (!vis[v.x][v.y]) ans++;
vis[v.x][v.y] = 1;
for(int i = 0; i < 4; i++){
int fx = dir[i][0]+v.x;
int fy = dir[i][1]+v.y; if (fx < 1 || fx > n || fy < 1 || fy > m || mp[fx][fy] == '*') continue;
if (bu[v.x][v.y] >= bu[fx][fy]) continue;
bu[fx][fy] = bu[v.x][v.y]; if ((i == 2) || (i == 3)) bu[fx][fy]++;
if (i == 2) {
if (v.r) que.push({fx, fy, v.l, v.r-1, v.l+v.r-1});
}
else if (i == 3) {
if (v.l) que.push({fx, fy, v.l-1, v.r, v.l+v.r-1});
}
else que.push({fx, fy, v.l, v.r, v.l+v.r});
}
}
printf("%d\n", ans);
} int main() {
cin >> n >> m;
cin >> sx >> sy;
cin >> sl >> sr;
for(int i = 1; i <= n; i++) scanf("%s", mp[i]+1);
bfs();
return 0;
}
												

带限制的广搜 codeforces的更多相关文章

  1. HDU-1026 Ignatius and the Princess I(BFS) 带路径的广搜

      此题需要时间更少,控制时间很要,这个题目要多多看, Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Me ...

  2. CodeForces 682C Alyona and the Tree(广搜 + 技巧)

    方法:从根节点开始广搜,如果遇到了应该删除的点,就再广搜删掉它的子树并标记,然后统计一下被标记的个数就是答案,所谓技巧就是从根节点开始搜索的时候,如果遇到了某个节点的距离<0,就让它是0,0可以 ...

  3. Codeforces 1105D(双层广搜)

    要点 题意:可以拐弯,即哈密顿距离 注意不可以直接一个一个搜,这过程中会把下一轮的标记上,导致同一轮的其它点没能正常完成应有的搜索 因此采用双层广搜,把同一轮先都出队列再的一起搜 #include & ...

  4. 『ice 离散化广搜』

    ice(USACO) Description Bessie 在一个冰封的湖面上游泳,湖面可以表示为二维的平面,坐标范围是-1,000,000,000..1,000,000,000. 湖面上的N(1 & ...

  5. 队列&广搜

    搜索里有深搜,又有广搜,而广搜的基础就是队列. 队列是一种特殊的线性表,只能在一段插入,另一端输出.输出的那一端叫做队头,输入的那一端叫队尾.是一种先进先出(FIFO)的数据结构. 正经的队列: 头文 ...

  6. HDU 1072 Nightmare (广搜)

    题目链接 Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth with a ...

  7. 用广搜实现的spfa

    用广搜实现的spfa,如果是用一般的最短路,会发现构图很麻烦,因为它不是路径带权值,而是自身带权值.写起来只要注意,在点出队列的生活将其标记为0,在要压入队列的时候,判断其标记是否为0,为0表示队列中 ...

  8. CF520B——Two Buttons——————【广搜或找规律】

    J - Two Buttons Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Su ...

  9. HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?

    这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others)  ...

随机推荐

  1. H3C DHCP服务器基本配置示例

  2. java Eclipse的使用技巧

    eclipse与myeclipse的关系(都属于java开发的工具): 后者是前者的一个插件,后来为了方便使用,myeclipse集合了eclipse,后者是收费的. 可大部分人都是用 eclipse ...

  3. C# 自动翻页 PPT 测试脚本

    本文告诉大家一个可以使用的 C# 脚本,可以用来自动打开 PPT 文件,然后不断执行翻页.每次翻页都截图.翻页之后自动关闭 PPT 再次打开 最近发现给 Office 做的插件,会在一定翻页次数的时候 ...

  4. Linux 内核PCI去除一个设备

    一个 PCI 可用多个不同的方法被从系统中去除. 所有的 card-bus 设备在一个不同的物 理因素上是真正的 PCI 设备, 并且内核 PCI 核心不区分它们. 允许在机器运行时加减 PCI 设备 ...

  5. indexdb开cai发keng实zhi践lu

    一直在维护一个用html2canvas截图转base64保存的项目,先不说html2canvas不同版本的不同坑的问题,就说转出来的这个base64字符长度实在太大了,尤其是遇到设计出图高度达到3千多 ...

  6. [数论] hdu 5974 A Simple Math Problem (数论gcd)

    传送门 •题意 一直整数$a,b$,有 $\left\{\begin{matrix}x+y=a\\ LCM(x*y)=b \end{matrix}\right.$ 求$x,y$ •思路 解题重点:若$ ...

  7. 2018-2-13-git-合并两个仓库

    title author date CreateTime categories git 合并两个仓库 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23:3 ...

  8. ssh批量免密

    expect命令在linux下实现批量ssh免密 发布时间:2017-11-27 08:41:39 投稿:laozhang 本次文章主要给大家讲解了在linux系统下用expect命令实现批量ssh免 ...

  9. Webpack4不求人系列(1)

    Webpack是一个现在Javascript应用程序的模块化打包器,在Webpack中JS/CSS/图片等资源都被视为JS模块,简化了编程.当Webpack构建时,会递归形成一个模块依赖关系图,然后将 ...

  10. 最长公共前缀 leetcode 14

    方法一(纵向扫描) 解题思路 先计算出数组中最小的字符串长度,这样就避免了越界的情况,思路更加明确,但同时时间复杂度就相应的上升了. 先计算所有字符串在同一列上的字符是否相同,然后依次向后延伸. 代码 ...