割草机

割草机

时间限制:C/C++ 1秒,其他语言2
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

有一块n*m的地,每块地要么长满杂草('W'表示),要么是空地('G'表示),现在有一个人站在(1,1),面向(1,m),他可以按如下两种方式移动:

 

1、向面朝的方向移动一格,耗费1单位时间

2、向下移动一格,并反转面朝的方向(右变左,左变右),耗费1单位时间

现在他想知道清除所有的杂草最少需要多少单位时间(清除完杂草之后不用返回(1,1))

输入描述:

第一行n,m
接下来n行每行一个字符串表示矩阵。
n,m<=150

输出描述:

一行一个整数表示答案。

示例1

输入

4 5

GWGGW

GGWGG

GWGGG

WGGGG

输出

11

示例2

输入

3 3

GWW

WWW

WWG

输出

7

思路:一开始看这道题以为是bfs/dfs那类。。。但是后来又感觉想多了,这个方向是固定的,也就是说必须把这一行的草都割完才能继续,否则不可能向上走,就回不来了。那怎么让它都割完呢?就首先从【1,1】开始,到下一行之前需要保证你下去的位置在能割到所有草的地方。就比如:你现在所在这行只能向右面走,那你需要保证所有的草都在你右边,同理,在你去下一行的时候,你只能向左走,那你下去的位置就要保证所有的草都在你左边才可以。还有一些细节就是如果下边没草就不用往下走了之类的。。。

说起来,这个用bfs/dfs可能也行。。。我这么想有些麻烦了。。。比较笨的方法。。。

 

 

#include <bits/stdc++.h>

using namespace std;

 

int main()

{

    int n,m;

    char c[155][155];

    int a[155][2];

    cin>>n>>m;

    for(int i=0;i<n;i++)

    {

        cin>>c[i];

    }

    memset(a,-1,sizeof(a));//初始化为-1

    for(int i=0;i<n;i++)

    {

        for(int j=0;j<m;j++)

        {

            if(c[i][j]=='W'&&a[i][0]==-1)

            {

                a[i][0]=j+1;

                a[i][1]=j+1;

            }

            if(c[i][j]=='W')

            {

                a[i][1]=j+1;

            }

        }

    }//先将每一行第一个有草的位置和最后一个有草的位置记在一个二维数组中

    /*for(int i=0;i<n;i++)

    {

        printf("%d %d \n",a[i][0],a[i][1]);

    }*/

    int ans=1,sum=0;

    for(int i=0;i<n-1;i++)

    {

        if(i%2==0)//偶数情况

        {

            if(a[i][1]!=-1)//这行有草 这行方向固定向右

            {

                sum+=abs(a[i][1]-ans);

                ans=a[i][1];//每次都更新ans的值

                //printf("sum=%d ans=%d\n",sum,ans);

                if(ans<a[i+1][1])

                {//需要和下一行草的位置比较 下一行方向是固定向左的 要保证下一行所有的草都在ans左边

                    sum+=abs(a[i+1][1]-ans);

                    ans=a[i+1][1];

                    //printf("sum=%d ans=%d\n",sum,ans);

                }

            }

            else//没草 也要判断需不需要多走 要保证下一行所有的草都在ans左边

            {

                if(ans<a[i+1][1]&&a[i+1][0]!=-1)

                {

                    sum+=abs(ans-a[i+1][1]);

                    ans=a[i+1][1];

                    //printf("sum=%d ans=%d\n",sum,ans);

                }

            }

        }

        else//同偶数情况分析

        {

            if(a[i][1]!=-1)

            {

                sum+=abs(ans-a[i][0]);

                ans=a[i][0];

                //printf("sum=%d ans=%d\n",sum,ans);

                if(ans>a[i+1][0]&&a[i+1][0]!=-1)

                {

                    sum+=abs(ans-a[i+1][0]);

                    ans=a[i+1][0];

                    //printf("sum=%d ans=%d\n",sum,ans);

                }

            }

            else

            {

                if(ans>a[i+1][0]&&a[i+1][0]!=-1)

                {

                    sum+=abs(a[i+1][0]-ans);

                    ans=a[i+1][0];

                    //printf("sum=%d ans=%d\n",sum,ans);

                }

            }

        }

        sum++;

        //printf("**sum=%d ans=%d**\n",sum,ans);

    }//这个不包括最后一行情况

    for(int i=n-1;i>=0;i--)

    {

        if(a[i][0]==-1)

            sum--;

        else

            break;

    }//倒着往上看 如果后面没有草就不必往下走 sum--

    if(a[n-1][0]!=-1)

    {

        if(n%2==1)

        {

            sum+=abs(a[n-1][1]-ans);

        }

        else

        {

            sum+=abs(ans-a[n-1][0]);

        }

    }//最后一行单独看 分奇偶

    cout<<sum<<endl;

    return 0;

}

 

 

<think>嗯,用户问的是"割草机算法"的概念和应用场景。首先,我需要确认这个术语的具体含义。从字面看,可能有两种理解:一种是字面意义上的割草机器人使用的算法,另一种可能是计算机科学中的某种算法模式,比如覆盖路径规划(Coverage Path Planning, CPP)。用户提供的引用资料里提到了割草机器人的研发和算法应用,比如引用[2]中的视觉定位导航,引用[4]中的场景功能设计,这些都属于实际应用。而引用[3]提到的机器人指令编辑和DCM算法,引用[5]的图灵机模型,可能涉及到算法的基础理论。 接下来,我需要区分这两种可能性。用户的问题可能更偏向实际应用,因为引用的资料主要集中在割草机器人的技术和场景上。比如引用[2]强调视觉技术和算法融合,引用[4]讨论机器人的功能设计。不过,用户也可能对算法模式感兴趣,比如类似割草机路径的覆盖算法。因此,回答应该涵盖这两个方面:实际应用中的割草机算法(如路径规划、避障等)和计算机科学中的覆盖路径规划概念。 然后,考虑如何组织信息。首先解释割草机算法在机器人领域的应用,包括关键技术如路径规划、定位导航、避障等,结合引用中的例子,如视觉定位(引用[2])、障碍物检测(引用[4])。然后介绍覆盖路径规划作为通用算法模式,解释其原理和应用场景,比如清洁机器人、农业机械等。需要确保LaTeX格式正确,例如路径规划中的覆盖问题可表示为数学公式。同时,生成的相关问题要引导用户深入探讨,如优化方法、不同场景的比较等。 还需要注意引用资料的关联。引用[1]提到3D打印提升研发效率,但可能不直接相关,而引用[3]的算法案例和引用[5]的计算模型可以支撑算法原理部分。用户意图明确指向割草机算法,因此重点应放在割草机器人的具体技术和通用覆盖算法上,确保回答结构清晰,分点阐述,并自然引用来源。</think>割草机算法通常有两层含义,分别对应不同的应用场景: --- ### 一、 **实际应用:割草机器人的核心算法** 指应用于智能割草机器人(如C37割草环卫机)的**环境感知、路径规划与决策控制算法**。其核心目标是实现高效、安全、自主的草坪覆盖作业。 **关键技术模块包括**: 1. **环境建模与定位** - 使用 **SLAM(同步定位与地图构建)** 技术,结合视觉传感器(如引用[2]提到的视觉定位导航)或激光雷达构建草坪地图。 - 定位精度直接影响路径规划效率,例如通过 **$(\Delta x, \Delta y, \theta)$** 描述机器人的实时位姿。 2. **全覆盖路径规划(Coverage Path Planning, CPP)** - 核心问题:**以最短路径无重复覆盖复杂多边形区域**。 - 常用方法: - **Boustrophedon(回字形)算法**:将区域分解为简单子区域,并行往返切割(如割草机典型路径)。 - **栅格法**:将草坪离散化为网格,通过 **$A^*$ 或Dijkstra算法** 搜索最优覆盖路径[^3]。 3. **动态避障与重规划** - 实时检测障碍物(如宠物、玩具),采用 **人工势场法** 或 **DWA(动态窗口法)** 调整路径。 - 引用[4]提到的“自动障碍物检测、防碰撞系统”即依赖此类算法。 4. **边界识别与工作区限定** - 通过物理边界线(埋线)或虚拟地理围栏(如GPS坐标)定义作业范围。 **应用场景**: - 家庭草坪、高尔夫球场、公园等场景的自动化修剪(如引用[1][2]中的C37割草机)。 - 农业场景中的作物监测与精准喷洒(扩展应用)。 --- ### 二、 **计算机科学:覆盖路径规划(CPP)的通用模型** 割草机路径问题本质是 **“覆盖路径规划”** 的经典案例,属于计算几何和机器人学交叉领域。 **算法核心目标**: $$ \text{minimize} \sum_{i=1}^{n} d_i \quad \text{subject to} \quad \bigcup_{i=1}^{n} A_i = \Omega $$ 其中 $d_i$ 为路径段长度,$\Omega$ 为目标区域,$A_i$ 为覆盖子区域。 **通用解决方案**: 1. **单元分解法**:将复杂多边形分解为凸单元(如梯形分解),再对各单元进行回字形扫描。 2. **扫描线算法**:模拟割草机行为,沿固定方向(如x轴)移动“切割线”,生成连续路径。 3. **启发式搜索**:在非结构化环境中结合遗传算法、蚁群优化等寻找近似最优解。 **扩展应用场景**: - **清洁机器人**:扫地机的弓字形清扫路径。 - **农业机械**:播种机、喷药车的农田覆盖作业。 - **地质勘探**:无人机对区域进行无遗漏测绘扫描。 --- ### 关键技术挑战与优化方向 1. **复杂地形适应性**:坡度、障碍物导致覆盖效率下降(引用[4]中的场景适配问题)。 2. **能耗优化**:路径总长度与转向次数直接影响电池续航(引用[1]的高效性能验证)。 3. **多机协同**:大型区域需多台设备协同覆盖,避免冲突(如引用[3]的分布式算法)。 > **案例参考**:来飞智能的割草机(引用[2])通过**视觉SLAM+低功耗传感器融合算法**,在降低成本的同时实现厘米级定位精度,验证了算法落地的可行性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值