版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34072526/article/details/87532555
题目描述 Description
小浣熊松松和朋友到野外露营,没想到遇上了π年一次的大洪水,好在松松是一只爱观察的小浣熊,他发现露营地的地形和洪水有如下性质:
①露营地可以被看做是一个N*M的矩形方阵,其中左上角坐标为(1,1),右下角坐标为(n,m),每个格子(i,j)都有一个高度h(i,j)。
②洪水送(r,c)开始,如果一个格子被洪水淹没,那这个格子四周比它低(或相同)的格子也会被淹没。
现在松松想请你帮忙算算,有多少个格子不会被淹没,便于他和朋友逃脱。
【原有误数据已删除】
输入描述 Input Description
第一行包含两个整数n,m,表示矩形方阵右下角坐标。
以下n行,每行m个数,第i行第j个数表示格子(i,j)的高度。
最后一行包含两个整数r,c,表示最初被洪水淹没的格子。
输出描述 Output Description
输出仅一行,为永远不会被淹没的格子的数量。
样例输入 Sample Input
3 3
1 2 3
2 3 4
3 4 5
2 2
样例输出 Sample Output
5
数据范围及提示 Data Size & Hint
对于90%的数据,保证随机生成。
对于100%的数据,1<=N,M<=1000。
代码
#include <cstdio>
#include <queue>
using namespace std;
const int dx[] = {0, 0, -1, 1};
const int dy[] = {-1, 1, 0, 0};
bool vis[1010][1010];
int matrix[1010][1010];
int n, m, r, c, res;
struct node{
int x, y;
}f;
int bfs(){
queue<node> q;
f.x = r, f.y = c;
q.push(f);
int iBfs, jBfs;
vis[f.x][f.y] = 1;
while(!q.empty()){
node b = q.front();
q.pop();
for(iBfs = 0; iBfs < 4; iBfs++){
node d;
d.x = b.x + dx[iBfs];
d.y = b.y + dy[iBfs];
if(d.x >= 1 && d.x <= n && d.y >= 1 && d.y <= m && !vis[d.x][d.y] && matrix[d.x][d.y] <= matrix[b.x][b.y]){
vis[d.x][d.y] = 1;
q.push(d);
}
}
}
for(iBfs = 1; iBfs <= n; iBfs++){
for(jBfs = 1; jBfs <= m; jBfs++){
if(!vis[iBfs][jBfs]) res++;
}
}
return res;
}
int main(){
int iMain, jMain;
scanf("%d %d", &n, &m);
for(iMain = 1; iMain <= n; iMain++){
for(jMain = 1; jMain <= m; jMain++) scanf("%d", &matrix[iMain][jMain]);
}
scanf("%d %d", &r, &c);
printf("%d", bfs());
return 0;
}