水淹七军(递归,又是递归)

北大2023级最强新生问我的,最后他的问题说是重写了一遍就解决了

乐死了,有的时候根本看不出源代码漏了哪里

我的思路是:

一个数组记录本次放水所经过的格子,经过的不再递归

一个数组记录地图上各地点的高度

一个数组记录地图上各地点被水淹过的高度(注意第三行)

开始递归前先判断这个放水点高度是否大于等于司令部所在地点的高度(高度相同也可以淹),和是否被水淹过

每递归一次,要判断是否到了司令部和是否超出边界以及司令部是不是已经被水淹了(算是剪枝)

还要判断这个地方水能不能漫延到(理所当然)

因为高度相同也可以淹,所以必须要多一个数组记录经过的格子

代码如下:

cs 复制代码
#include<stdio.h>
#include<stdlib.h>
void dg(int x, int y, int occ[201][201]);
int M, N, I, J, X, Y, jud = 0;//表示暂时还没被水淹
struct MAP{
    int h;//本来的高度
    int w_h;//后来的高度
}map[201][201];

int main(void)
{
    int K, P;
    scanf("%d", &K);
    for(int k = 0; k < K; k++)
    {
        jud = 0;
        //输入
        scanf("%d%d", &M, &N);
        for(int i = 1; i <= M; i++)
            for(int j = 1; j <= N; j++)
            {
                scanf("%d", &map[i][j].h);
                map[i][j].w_h = map[i][j].h;
            }
        scanf("%d%d%d", &I, &J, &P);
        for(int i = 0; i < P; i++)
        {
            scanf("%d%d", &X, &Y);
            int occ[201][201] = {0};
            if(map[X][Y].h >= map[I][J].h && map[X][Y].h == map[X][Y].w_h)
                dg(X, Y, occ);
        }
        if(jud)  printf("Yes\n");
        else  printf("No\n");
    }
}
void dg(int x, int y, int occ[201][201])
{
    if(occ[x][y])  return;
    if(x == I && y == J)  jud = 1;
    if(jud == 1)  return;
    if(x == 0 || y == 0 || x == M + 1 || y == N + 1)  return;
    if(map[X][Y].h < map[x][y].h)  return;

    map[x][y].w_h = map[X][Y].h, occ[x][y] = 1;
    dg(x + 1, y, occ), dg(x - 1, y, occ), dg(x, y + 1, occ), dg(x, y - 1, occ);
    return;
}
相关推荐
晨晖26 小时前
顺序查找:c语言
c语言·开发语言·算法
LYFlied7 小时前
【每日算法】LeetCode 64. 最小路径和(多维动态规划)
数据结构·算法·leetcode·动态规划
Salt_07287 小时前
DAY44 简单 CNN
python·深度学习·神经网络·算法·机器学习·计算机视觉·cnn
货拉拉技术7 小时前
AI拍货选车,开启拉货新体验
算法
MobotStone7 小时前
一夜蒸发1000亿美元后,Google用什么夺回AI王座
算法
Wang201220137 小时前
RNN和LSTM对比
人工智能·算法·架构
xueyongfu7 小时前
从Diffusion到VLA pi0(π0)
人工智能·算法·stable diffusion
永远睡不够的入8 小时前
快排(非递归)和归并的实现
数据结构·算法·深度优先
cheems95278 小时前
二叉树深搜算法练习(一)
数据结构·算法
sin_hielo8 小时前
leetcode 3074
数据结构·算法·leetcode