您的位置:首页 > 其它

HRBUST - 1143 泉水 (简单DFS)

2018-03-28 14:35 176 查看

description

Leyni是一个地址调查员,有一天在他调查的地方突然出现个泉眼。由于当地的地势不均匀,有高有低,他觉得如果这个泉眼不断的向外溶出水来,这意味着这里在不久的将来将会一个小湖。水往低处流,凡是比泉眼地势低或者等于的地方都会被水淹没,地势高的地方水不会越过。而且又因为泉水比较弱,当所有地势低的地方被淹没后,水位将不会上涨,一直定在跟泉眼一样的水位上。

由于Leyni已经调查过当地很久了,所以他手中有这里地势的详细数据。所有的地图都是一个矩形,并按照坐标系分成了一个个小方格,Leyni知道每个方格的具体高度。我们假定当水留到地图边界时,不会留出地图外,现在他想通过这些数据分析出,将来这里将会出现一个多大面积的湖。

Input

有若干组数据,每组数据的第一行有四个整数n,m,p1,p2(0

Output

输出对应地图中会有多少个格子被水充满。

Sample Input

3 5 2 3

3 4 1 5 1

2 3 3 4 7

4 1 4 1 1

Sample Output

6

solution

DFS模板题,也可以使用BFS。

注意于BFS差别

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 1e3 + 10;
bool vst[maxn][maxn];
int pic[maxn][maxn];
int M, N, SX, SY, ANS;
int dir[4][2] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
bool check(int x, int y)
{
//注意状态检测先检测边界!如果先检测vst会有数组越界的危险
if (x > 0 && x <= M && y > 0 && y <= N && !vst[x][y] && pic[x][y] <= pic[SX][SY])
return true;
return false;
}
void DFS(int sx, int sy)
{
vst[sx][sy] = true;
ANS++;
// 不同于BFS这里没有目标状态的检测
for (int i = 0; i < 4; i++)
{
//构造下一次状态
int nx = sx + dir[i][0], ny = sy + dir[i][1];
//状态检测
if (check(nx, ny))
{
//直接递归,不同于BFS,不需要改变状态数组vst
DFS(nx, ny);
}
}
}
int main()
{
// freopen("in.txt", "r", stdin);
while (~scanf("%d%d%d%d", &M, &N, &SX, &SY))
{
for (int i = 1; i <= M; i++)
for (int j = 1; j <= N; j++)
scanf("%d", &pic[i][j]);
ANS = 0;
memset(vst, false, sizeof(vst));
DFS(SX, SY);
printf("%d\n", ANS);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: