1144 农场灌溉

贪心算法训练(六)——喷水装置(区间覆盖问题) 贪心算法训练(六)——喷水装置(区间覆盖问题) 1. 问题描述   长 L 米,宽 W 米的草坪里装有 n 个浇灌喷头,每个喷头都装在草坪的中心线上(离两边各 W/2 米)。我们知道每个喷头的位置(离草坪中心线左端的距离),以及它能覆盖到的浇灌范围。请问如果要同时浇灌整块草坪,最少需要打开多少个喷头? 2. 输入格式   输入包含若干测试数据... 阅读详情

时限:1000ms 内存限制:10000K 总时限:3000ms

描述
一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。
这里写图片描述

输入
给出若干由字母表示的最大不超过50×50具体由(m,n)表示,的农场图

输出
编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。

输入样例
2 2 DK HF 3 3 ADC FJK IHE -1 -1

输出样例
2 3

提示
参考迷宫问题,实现时关键要解决好各块的表示问题。
分析:该问题与迷宫问题相似,都采用广度优先搜索,不同的是,农场灌溉问题只往上和往左搜索,因为涉及到水渠的连接问题,如果右边和左边的正好相连,或下面和上面的正好相连,则将其合并

#include <iostream>

using namespace std;
char a[50][50];    //农场构造
int state[2500];//每一块农田往最上最左可以追溯到哪一块
int m,n;
int move[2][2]={{0,-1},{-1,0}};//分别表示农田的上方和左方两
void merge(int row1,int row2)
{    int temp,big,small;
     int i,j;
     big=state[row1];
     small=state[row2];
     for(i=0;i<m;i++)
        for(j=0;j<n;j++)
     {
         if(state[i*m+j]==big)
            state[i*m+j]=small;    //把之前延伸到big所在农田块的农田,一次性全部延伸到small所在
                                   //向左上延伸
     }


} inbound(int row,int col)
{
    if(row>=0&&col>=0&&row<m&&col<n)
        return 1;
    return 0;
}
void search()
{  int i,j,k;
   int i1,j1,row1,row2;    //状态数组的下标
   for(i=0;i<m;i++)
    for(j=0;j<n;j++)
    {
        for(k=0;k<2;k++)
        {
            i1=i+move[k][0];
            j1=j+move[k][1];  //分别表示农田的上方和左方两个位置
            if(!inbound(i1,j1))
                continue;        //越界,结束本次循环,开始下一次
             row1=i*m+j;        //把二维数组转化成一维数组
             row2=i1*m+j1;
            if(k==0)         //当前块与其左边一块农田的关系
            {
                if(a[i][j]=='A'||a[i][j]=='C'||a[i][j]=='F'||a[i][j]=='G'||a[i][j]=='H'||a[i][j]=='I'||a[i][j]=='K')
                    //有一条连向左边那条边的横线
                    if(a[i1][j1]=='B'||a[i1][j1]=='D'||a[i1][j1]=='F'||a[i1][j1]=='G'||a[i1][j1]=='I'||a[i1][j1]=='J'||a[i1][j1]=='K')
                    //在a[i][j]左边刚好有一条横着连向右边的边的横线
                    merge(row1,row2);    //合并这两块
            }
            else
            {
                if(a[i][j]=='A'||a[i][j]=='B'||a[i][j]=='E'||a[i][j]=='G'||a[i][j]=='H'||a[i][j]=='J'||a[i][j]=='K')
                //向上延伸
                    if(a[i1][j1]=='C'||a[i1][j1]=='D'||a[i1][j1]=='E'||a[i1][j1]=='H'||a[i1][j1]=='I'||a[i1][j1]=='J'||a[i1][j1]=='K')
                    //向下延伸
                    merge(row1,row2);     //合并这两块
            }
        }

    }

}
int main()
{   int i,j,sum;
    while(true)
    {
       cin>>m>>n;
       if(m<0||n<0)
        break;
        for(i=0;i<m;i++)         //先把每一块农田看做独立的
            for(j=0;j<n;j++)
            {
             state[i*m+j]=i*m+j;
             cin>>a[i][j];
            }

            search();
        sum=0;
        for(i=0;i<n*m;i++)
            if(state[i]==i)
            sum++;
        cout<<sum<<endl;

    }
    return 0;
}

关于合并的函数,本来参照之前的答案,我是这样写的

void merge(int row1,int row2)
{    int temp,big,small;
     int i,j;
     big=state[row1];
     small=state[row2];
     if(big==small)
        return;
     if(big<small)
     {
         temp=big;
         big=small;
         small=temp;
     }
     for(i=0;i<m;i++)
        for(j=0;j<n;j++)
     {
         if(state[i*m+j]==big)
            state[i*m+j]=small;    //把之前延伸到big所在农田块的农田,一次性全部延伸到small所在
                                   //向左上延伸
     }


}

但是考虑到本问题解决问题的顺序本来就是从左到右上到下,所以big所代表的状态值按照常规是比其左边或上边的大的,所以作者省略了比较的部分。
出现的问题:一开始运行的时候,不管怎么样,输出的结果即sum值都不对。最后经检查是,j1=j+move[k][1];这一句写成了j1=j+move[k][0];细心!

NOIP刷题记录(浇水) 代码】NOIP刷题记录(浇水) 阅读详情

相关推荐

【NOJ1144】【算法实验二】【DFS_回溯】农场灌溉问题

1144.农场灌溉问题 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。 输入 给出(m,n)表示农场大小,若干由字母表示的农场图(最大不超过50×50) m==-1&amp;&amp;n==-1表示结束 输出 编程求出最小需要打的井数。每个测例的输出占一行。当M...

夏至是个程序媛 1558

最优灌溉问题 (最小生成树Prim算法) C++实现

最优灌溉问题 C++问题描述输入形式输出形式样例输入和输出问题分析完整代码如下 问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉。   为了灌溉,雷雷需要建立一些水渠,以连接水井和麦田,雷雷也可以利用部分麦田作为“中转站”,利用水渠连接不同的麦田,这样只要一片麦田能被灌溉,则与其连接的麦田也能被灌溉。   现在雷雷知道哪些麦田之间可以建设水渠和建设每个水渠所需要的费用(注意不是所有麦田之间都可以建立水渠)。请问灌溉所有麦田最少需要多少费用来

weixin_43915303的博客 1621

NOJ 1144.农场灌溉问题

内存限制:10000K 总时限:3000ms 描述 一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。 输入 给出若干由字母表示的最大不超过50×50具体由(m,n)表示,的农场图 输出 编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。 输入样例 2 2 DK HF 3 3 ADC FJK IHE -1 -1 输出样例 2 3 提示 参考迷宫问题,实现时关键要解决好各块的表示问题。...

路途遥远,初心难忘,道阻且长,愿君走出半生,归来仍是少年 742

农田灌溉 AcWing

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 题目描述 https://www.acwing.com/problem/content/description/4380/ 一、初始代码 没什么技巧,纯纯的模拟 又臭又长不说,还有很多的bug,改了好久才全部通过,😔, #include<bits/stdc++.h> using nam..

weixin_63681863的博客 668

农场灌溉问题 c语言实现

一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。 输入:给出若干由字母表示的最大不超过50×50具体由(m,n)表示,的农场图 输出:编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。

农场灌溉问题

一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。给出若干由字母表示的最大不超过50×50具体由(m,n)表示,的农场图,编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。

605. 种花问题(简单)

2021 起航

Enter 342

农场灌溉问题给出若干由字母表示的最大不超过50×50具体由(m,n)表示,的农场图,编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。

一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。给出若干由字母表示的最大不超过50×50具体由(m,n)表示,的农场图,编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。

1144.农场灌溉问题

1144.农场灌溉问题 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。   输入 给出若干由字母表示的最大不超过50×50具体由(m,n)表示,的农场图   输出 编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。   输入样例 ...

rain699的博客 660

农场灌溉问题java源码

用java写的农场灌溉问题的源代码,此程序运用了分支限界法,本文档为完整的工程文档,可以从文件中读入测例。

JAVA算法分析农场灌溉问题

农场灌溉问题,给定N*N农场,计算最少的井数~,JAVA界面实现。可看看效果

【NOJ1144】【算法实验二】农场灌溉问题

1144.农场灌溉问题 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。 输入 给出(m,n)表示农场大小,若干由字母表示的农场图(最大不超过50×50) m==-1&&n==-1表示结束 输出 编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。 #include <iostream> using namespace std; s

ZYP 1123

别再瞎试了!用Python+正交设计,5分钟搞定你的多因素实验方案

本文介绍了如何利用Python和正交设计高效优化多因素实验方案。正交设计通过精心设计的正交表,用最少的实验次数覆盖所有因素的水平组合,显著提升实验效率。文章详细讲解了正交设计的核心优势、Python实现工具链、实验实施与数据分析方法,以及高级技巧与常见问题解决方案,帮助读者快速掌握这一强大的实验优化技术。

weixin_42526087的博客 334

NOJ-1144-农场灌溉问题

农场灌溉问题 代码: #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn=100+5; struct Node{ int l,r,u,d; }t[maxn],a[maxn][maxn]; int n,m,vis[maxn][maxn]; void dfs(int x,int y){ if

Phoenix_ZengHao的博客 565

地瓜派RDK X5部署YOLOv11n避坑指南:从Softmax瓶颈到BPU加速的实战解析

本文详细解析了在地瓜派RDK X5开发板上部署YOLOv11n模型时,从性能暴跌到成功优化的全过程。核心在于通过配置`node_info`将模型中的Softmax算子强制在BPU上以int16精度运行,解决了因算子被分配到CPU导致的严重性能瓶颈。实战部署后,模型推理延迟从126ms降至10.8ms,FPS从7.9提升至92.3,实现了显著的性能优化。

beta5的博客 865

Open3D:读写点云与可视化(C++)

迭代 //Open3D #include "Open3D/Open3D.h" //Eigen #include "Eigen/Dense" void testOpen3D::xjGetInformation(const QString &pcPath) { /* read PC */ auto cloud_ptr = std::make_shared<open3d::geometry::PointCloud>(); if (!open3d::io::ReadPointCl

累了就要打游戏 1万+

农场灌溉(利用中心点的搜索)

1144.农场灌溉问题 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。   输入 给出若干由字母表示的最大不超过50×50具体由(m,n)表示,的农场图   输出 编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。   输入样例 ...

碳酸钙的01妖精的博客 313

数据产品需求文档(PRD)怎么写?阿里P8分享的模板+5个避坑点

作用:记录文档的版本、作者、评审信息,避免“文档混乱”。填写规范字段说明示例文档名称清晰反映产品名称,如“用户行为分析平台PRD”用户行为分析平台PRD_V1.0文档版本用“版本号+日期”,如V1.0_20240301编写人数据产品经理姓名+联系方式张三(138-XXXX-XXXX)评审人员业务负责人、开发经理、数据分析师、运维负责人李四(业务)、王五(开发)、赵六(数据)、周七(运维)评审时间评审日期2024-03-05评审意见。

架构师的AI之路,分享AI应用开发架构的学习与实践。 1575

农场灌溉问题(回溯)

题目: 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。 输入 给出若干由字母表示的最大不超过50×50具体由(m,n)表示,的农场图 输出 编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。 输入样例 2 2 DK HF 3 3 ADC...

偷吃了老鼠的土豆 544

桂电 数电实验 期末考试 试卷+解析(74LS192 + 74LS153 + 74LS139 + 74LS00 / 74LS20)

桂电 数电实验 期末考试 试卷+解析(74LS192 + 74LS153 + 74LS139 + 74LS00 / 74LS20)

Molly 的博客 1万+

3dmax文件格式转换——.max 转换为 .flt(解决转换后.flt没有纹理贴图的问题)

本文主要介绍如何在3dmax中将.max格式文件转换为.flt格式文件,并解决转换后的文件没有纹理贴图的问题。 在3dmax中,将.max文件转换为.flt格式,只需导出选择.flt格式即可,但是导出的文件在osgEarth中加载后,缺少纹理和贴图。 下面是解决方案: 1、选中加载的模型,然后点击 渲染-> 渲染到纹理 2、将 渲染到纹理 子窗口往下拉,点击 添加 按钮,添加 ...

cchangcs 6170

农场灌溉问题ZOJ2412

描述: 一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。 输入: 给出若干由字母表示的最大不超过50×50具体由(m,n)表示,的农场图 输出: 编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。 输入样例: 2 2 DK HF 3 3 ADC FJK IHE -1 -1 输出样例: 2

axiqia的专栏 2351

光伏微电网蓄电池储能控制系统设计及动态性能分析

本文构建了光伏微电网蓄电池储能控制系统的完整理论体系。在系统架构方面,提出了基于直流母线电压平衡的多时间尺度能量管理理论,建立了光伏发电单元的二阶物理模型和MPPT动态跟踪算法。针对蓄电池系统,设计了融合二阶RC等效电路与扩展卡尔曼滤波的SOC估计方法,误差控制在3%以内。双向DC-DC变换器采用状态空间平均建模方法,推导了小信号传递函数,为闭环控制提供理论基础。该体系实现了从瞬时功率平衡到长期能量调度的多层级协同控制,为微电网稳定运行提供了系统的解决方案。

AI的内部世界的博客 191
上一篇: 1009 迷宫问题
下一篇: 1145 求图像的周长
LemonCcoder
博客等级 码龄11年 7粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值