HDU - 2612 Find a way(BFS)

本文介绍了一种双起点BFS寻路算法的具体实现,该算法用于寻找地图上两个不同起点到多个终点的最短总时间。通过使用C++语言进行详细编码,并通过样例输入输出展示了算法的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei have many people to meet. Especially a good friend Merceki. 
Yifenfei’s home is at the countryside, but Merceki’s home is in the center of city. So yifenfei made arrangements with Merceki to meet at a KFC. There are many KFC in Ningbo, they want to choose one that let the total time to it be most smallest. 
Now give you a Ningbo map, Both yifenfei and Merceki can move up, down ,left, right to the adjacent road by cost 11 minutes. 

Input

The input contains multiple test cases. 
Each test case include, first two integers n, m. (2<=n,m<=200). 
Next n lines, each line included m character. 
‘Y’ express yifenfei initial position. 
‘M’    express Merceki initial position. 
‘#’ forbid road; 
‘.’ Road. 
‘@’ KCF 

Output

For each test case output the minimum total time that both yifenfei and Merceki to arrival one of KFC.You may sure there is always have a KFC that can let them meet.

Sample Input

4 4
Y.#@
....
.#..
@..M
4 4
Y.#@
....
.#..
@#.M
5 5
Y..@.
.#...
.#...
@..M.
#...#

Sample Output

66
88
66

四个状态:前后左右,使用二维数组来储存,注意——队列(queue)的使用,两次BFS的更新问题。

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#define MAXN 100010
using namespace std;
int dis[4][2] = {{-1, 0}, {0, 1},
                 {0, -1}, {1, 0}};
char map[500][500];
int vis[500][500], m[500][500], y[500][500];
int M, N, x1, x2, y1, y2;
struct node{
    int x;
    int y;
    int step;
};
void bfs(int x, int y, int a[][500])
{
    queue <node> p;
    node cnt;
    cnt.x = x;
    cnt.y = y;
    cnt.step = 0;
    p.push(cnt);
    while(!p.empty())
    {
        node temp;
        cnt = p.front();                                //先赋值再出队 
        p.pop();
        for(int i = 0; i < 4; i++)
        {
            temp = cnt;
            int tx = cnt.x+dis[i][0];
            int ty = cnt.y+dis[i][1];
            if(map[tx][ty] != '#'&&tx>=0&&ty>=0&&vis[tx][ty]!=1&&tx<M&&ty<N) //!!!改成大于等于号 
            {
                temp.x = tx; 
                temp.y = ty;
                temp.step++;
                vis[tx][ty] = 1;
            }
            else
            {
//                cout << "!!" << endl;
                continue;
            }
            if(map[tx][ty] == '@')
            {
                a[tx][ty] = temp.step;
            }
            p.push(temp);
        }
    }
    
}
int main()
{
//    freopen("in.txt", "r", stdin);
    std::ios::sync_with_stdio(false);
    while(cin >> M >> N)
    {
        memset(vis, 0, sizeof(vis));
        memset(m, 0, sizeof(m));
        memset(y, 0, sizeof(y));
        for(int i = 0; i < M; i++)
            cin >> map[i];
        for(int i = 0; i < M; i++)
        {
            for(int j = 0; j < N; j++)
            {
                if(map[i][j] == 'M')
                {
                    x1 = i;
                    y1 = j;
                }
                if(map[i][j] == 'Y')
                {
                    x2 = i;
                    y2 = j;
                }
            }
        }
        vis[x1][y1] = 1;
        bfs(x1, y1, m);
//        for(int i = 0; i < M; i++)
//        {
//            for(int j = 0; j < N; j++)
//            {
//                cout << m[i][j] << " ";
//            }
//            cout << endl;
//        }
        memset(vis, 0, sizeof(vis));    //重新初始化vis数组 
        vis[x2][y2] = 1;
        bfs(x2, y2, y);
//        for(int i = 0; i < M; i++)
//        {
//            for(int j = 0; j < N; j++)
//            {
//                cout << y[i][j] << " ";
//            }
//            cout << endl;
//        }
        int min = MAXN;
        for(int i = 0; i < M; i++)
            for(int j = 0; j < N; j++)
            
            {
                if(min > m[i][j] + y[i][j] && m[i][j] && y[i][j])
                    min = m[i][j] + y[i][j];
            }
        cout << min*11 << endl;
    }
}

 

该合成数据集模拟了世界领先的运动服装和鞋类品牌之一耐克的零售和在线销售交易。它故意填充了凌乱、未清理的记录,以复制真实世界的业务数据,非常适合练习数据清理、探索性数据分析 (EDA) 以及构建仪表板或项目组合项目。 有什么超过 2,500 条交易记录,包含: 多个产品线(跑步、篮球、生活方式、训练、足球) 特定性别的销售(男性、女性、儿童) 零售店和在线渠道的销售额 常见的数据问题,例如:空值、地区拼写错误、错误的数据类型、数值列中的负值、日期格式不一致(例如,2023/07/21、21-07-2023 等)、折扣> 100%。 列描述 Order_ID ----交易/订单 ID(一些重复条目) Gender_Category------- 买家细分:男士、女士或儿童 Product_Line------ 商品类型:跑步、篮球等 Product_Name -------售出的特定商品(例如,Air Force 1、Pegasus Turbo) 尺寸-----商品尺寸(例如 7、M、L - 包括缺失/不一致) Units_Sold-------- 销售数量(可以是负数或空数) 建议零售价---------- 最高零售价(有些为零或零) Discount_Applied------ 销售折扣(有些超过 100%) 收入-------折扣后的最终金额(有些计算错误) Order_Date --------交易日期(多种格式和空) Sales_Channel -----------在线或零售 区域-------------印度城市(包括“德里”、“孟加罗尔”等拼写错误) 利润 --------------赚取的利润(可能是不切实际的或负的)
内容概要:本文详细介绍了果蔬采摘机器人末端执行器的柔顺抓取力控制方法,特别是基于广义比例积分(GPI)的力矩控制技术。文章首先概述了该方法的核心原理,即通过建模电机驱动的末端执行器,推导出电机输入电压与负载力矩的关系,并利用积分重构器设计GPI力矩反馈控制器,将力偏差转化为电机输入电压控制。相比传统PI控制,GPI方法无需对力矩跟踪误差求导,避免了系统延时和噪声问题。文章还提供了详细的Python代码实现,包括系统建模、GPI控制器设计、仿真比较和性能指标计算。实验结果表明,GPI控制方法在力矩跟踪误差、采摘完好率等方面表现出显著优势。 适合人群:具备一定编程基础,尤其是对机器人控制、自动化和机电一体化领域有兴趣的研发人员和技术爱好者。 使用场景及目标:①适用于果蔬采摘机器人或其他需要柔顺力控制的机器人应用;②通过仿真和实物实验,验证GPI控制在力矩跟踪、控制平稳性和采摘完好率等方面的优势;③帮助研究人员理解GPI控制器的设计原理及其相对于传统PI控制的改进之处。 其他说明:文章不仅提供了完整的理论推导和代码实现,还深入探讨了GPI控制器的关键技术和工程实现细节,如积分重构技术、四阶误差动态补偿、极点配置方法等。此外,文中还包含了实物实验结果统计和性能对比分析,进一步验证了GPI控制的实际应用价值。对于希望深入了解果蔬采摘机器人末端执行器控制技术的研究人员来说,这是一份非常有价值的参考资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值