描述 | |
随着最后通牒的递出,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 | |
例子输出 | |
Yes |
#include<iostream>
using namespace std;
int K, M, N;
struct map
{
int hight;//该点高度
bool flag = 0;//是否被水淹过
};
map A[210][210] = {};
int targetx = 0, targety = 0;//司令部位置
int water[4000][2] = {};//放水点位置
int num_w = 0;//放水点数
void f(int x, int y)//将位于x,y的放水点所能淹的位置全淹了
{
if (x <= 0 || y <= 0 || x > M || y > N)return;
A[x][y].flag = 1;
if (A[x][y].hight > A[x - 1][y].hight || //高度比x,y的低
(A[x][y].hight == A[x - 1][y].hight && A[x - 1][y].flag == 0)) {//高度相同且没被淹过(缺少判断是否淹过,会导致陷入死循环)
A[x - 1][y].hight = A[x][y].hight;
f(x - 1, y);
}
if (A[x][y].hight > A[x][y - 1].hight ||
(A[x][y].hight == A[x][y - 1].hight && A[x][y - 1].flag == 0)) {
A[x][y - 1].hight = A[x][y].hight;
f(x, y - 1);
}
if (A[x][y].hight > A[x][y + 1].hight ||
(A[x][y].hight == A[x][y + 1].hight && A[x][y + 1].flag == 0)) {
A[x][y + 1].hight = A[x][y].hight;
f(x, y + 1);
}
if (A[x][y].hight > A[x + 1][y].hight ||
(A[x][y].hight == A[x + 1][y].hight && A[x + 1][y].flag == 0)) {
A[x + 1][y].hight = A[x][y].hight;
f(x + 1, y);
}
}
int main()
{
cin >> K;
while (K--) {
cin >> M >> N;
for (int i = 1; i <= M; ++i) {
for (int j = 1; j <= N; ++j) {
cin >> A[i][j].hight;
A[i][j].flag = 0;//重置!!!
}
}
cin >> targetx >> targety;
cin >> num_w;
for (int i = 0; i < num_w; ++i) {
cin >> water[i][0] >> water[i][1];
}
for (int i = 0; i < num_w; ++i) {
f(water[i][0], water[i][1]);
}
if (A[targetx][targety].flag) { cout << "Yes" << endl; }
else cout << "No" << endl;
}
return 0;
}