函数——水淹七军

描述
随着最后通牒的递出,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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值