**总时间限制: **
1000ms
内存限制:
65536kB
描述
随着最后通牒的递出,C国的总攻也开始了,由于C国在地形上的优势,C国总司令下令采用水攻,剿灭A国最后的有生力量。
地形图是一个M*N的矩阵,矩阵上每一个点都对应着当前点的高度。C国总司令将选择若干个点进行放水。根据水往低处流的特性,水可以往四个方向的流动,被淹的地方的水面高度便和放水点的高度一样。然而,A国不是一马平川的,所以总会有地方是淹没不到的。你的任务很简单,判断一下A国司令部会不会被淹没掉。
我们将给你完整的地形图,然后给出A国司令部所在位置,给出C国将在哪几个点进行放水操作。你所需要的,就是给出A国司令部会不会被水淹。
输入
第一行:一个整数K,代表数据组数。
对于每一组数据:
第1行:符合题目描述的两个整数,M(0 < M <= 200)、N(0 < N <= 200)。
第2行至M+1行:每行N个数,以空格分开,代表这个矩阵上的各点的高度值H(0 <= H <= 1000)。
第M+2行:两个整数I(0 < I <= M)、J(0 < J <= N),代表司令部所在位置。
第M+3行:一个整数P(0 < P <= M * N),代表放水点个数。
第M+4行至M+P+4行:每行两个整数X(0 < X <= M)、Y(0 < Y <= N),代表放水点。
输出
对于每组数据,输出一行,如果被淹则输出Yes,没有则输出No。
样例输入
1
5 5
1 1 1 1 1
1 0 0 0 1
1 0 1 0 1
1 0 0 0 1
1 1 1 1 1
3 3
2
1 1
2 2
样例输出
No
提示
样例中左上角的位置是(1, 1),右上角的位置是(1, 5), 右下角的位置是(5, 5).
样例中的表示相等高度不能流到.
思路:
这里提到水往四处流,显而易见可以用DFS
代码
#include<bits/stdc++.h>
using namespace std;
#define sf(a) scanf("%d",&a)
#define sfs(a) scanf("%s",a)
const int MAXN = 202;
int n,m,len;
//DFS数组
int vis[MAXN][MAXN];
//存放高度的数组
int a[MAXN][MAXN];
//司令部所在的位置
int rp,cp;
//放水的个数
int p;
//上下左右
const int dr[] = {1,0,-1,0};
const int dc[] = {0,1,0,-1};
void dfs(int row,int col){
vis[row][col] = 1;
for(int i = 0;i<4;++i){
int r = row + dr[i],c = col + dc[i];
if(r<=m&&r>=1&&c<=n&&c>=1&&vis[r][c]===0&&a[row][col]>a[r][c]){
a[r][c] = a[row][col];
dfs(r,c);
}
}
}
int main(){
int K,t1,t2;
sf(K);//输入数据组数
while(K--){
memset(vis,0,sizeof(vis));
sf(m);
sf(n);
for(int i = 1;i<=m;++i){
for(int j = 1;j<=n;++j){
sf(a[i][j]);
}
}
sf(rp);
sf(cp);
sf(p);
while(p--){
//输入放水点的坐标
sf(t1);
sf(t2);
dfs(t1,t2);
}
printf("%s\n",(vis[rp][cp]==0?"No":"Yes"));
}
return 0;
}