UVA 10047--The Monocycle

用Arduino和8个舵机,从零搭建一台能走路的并联腿机器狗(附完整代码与3D模型) 本文详细介绍了如何用Arduino和8个舵机从零搭建一台能走路的并联腿机器狗,包括硬件准备、结构组装、电路系统搭建、运动算法实现和Arduino编程。通过完整的代码与3D模型,帮助创客深入理解机器人运动原理,实现稳健行走的8自由度机器狗。 阅读详情

题目:这是题目


题意:车轮有五种颜色,每次车子在一个点可以有三种行为,朝着原来方向往前走,或者把车的方向转左或转右,这三个行为都要花费1s时间。车子在起点的车轮颜色是绿色,车头朝上,要求车子到达终点车轮颜色也是绿色,方向可以随意,问是否能到达?能到达最少的时间是多少?


思路:对于每一个格子,要记录5个属性:横坐标、纵坐标、颜色、方向、时间。由于走过的格子是可以再走的,所以我们用一个4维数组记录一个格子,一种颜色和一个方向的所花的最短时间。然后是方向的问题,要么当前方向,要么左转和右转,具体方向的处理见图:


如果当前方向为turn,那么左转和右转方向分别为(turn + 3) % 4 和(turn + 1) % 4。


实现:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <math.h>
using namespace std;
const int MAX = 30;
const int INF = 0x3f3f3f3f;
char _map[MAX][MAX];
int d[MAX][MAX][6][4];//记录到一点一种颜色一个方向的最短路 0green 1white 2blue 3red 4black
int x[4] = {-1, 0, 1, 0};
int y[4] = {0, 1, 0, -1};
int m, n;
int sx, sy, ex, ey;
int ti;

struct node {
    int xi, yi, color, turn, time;
};

bool bfs() {
    queue <node> q;
    node start;
    start.xi = sx;
    start.yi = sy;
    start.color = 0;
    start.time = 0;
    start.turn = 0;
    d[sx][sy][start.color][0] = 0;
    q.push(start);
    while (!q.empty()) {
        node head, tail;
        head = q.front();
        q.pop();
        if (head.xi == ex && head.yi == ey && head.color == 0) {
            ti = head.time;
            return true;
        }
        for (int i = 0; i < 3; i++) {
            if (i == 0) {
                int xx = head.xi + x[head.turn];
                int yy = head.yi + y[head.turn];
                if (xx >= 0 && xx < m && yy >= 0 && yy < n && _map[xx][yy] != '#'
                    && d[xx][yy][(head.color + 1)%5][head.turn] > head.time + 1) {//记录当前这个格子的该颜色的该方向的时间是否比上一步走到这长,长则更新
                    tail.xi = xx;
                    tail.yi = yy;
                    tail.turn = head.turn;
                    tail.time = head.time + 1;
                    tail.color = (head.color + 1)%5;
                    d[xx][yy][tail.color][tail.turn] = tail.time;
                    q.push(tail);
                }
            }
            else if (i == 1) {
                int xx = head.xi;
                int yy = head.yi;
                if (xx >= 0 && xx < m && yy >= 0 && yy < n && _map[xx][yy] != '#'
                    && d[xx][yy][head.color][(head.turn + 3) % 4] > head.time + 1) {//<span style="font-family: Arial, Helvetica, sans-serif;">记录当前这个格子的该颜色的向左方向的时间是否比上一步走到这长,长则更新</span>
                    tail.xi = xx;
                    tail.yi = yy;
                    tail.turn = (head.turn + 3) % 4;
                    tail.color = head.color;
                    tail.time = head.time + 1;
                    d[xx][yy][tail.color][tail.turn] = tail.time;
                    q.push(tail);
                }
            }
            else if (i == 2) {
                int xx = head.xi;
                int yy = head.yi;
                if (xx >= 0 && xx < m && yy >= 0 && yy < n && _map[xx][yy] != '#'
                    && d[xx][yy][head.color][(head.turn + 1) % 4] > head.time + 1) {//<span style="font-family: Arial, Helvetica, sans-serif;">记录当前这个格子的该颜色的向右方向的时间是否比上一步走到这长,长则更新</span>
                    tail.xi = xx;
                    tail.yi = yy;
                    tail.turn = (head.turn + 1) % 4;
                    tail.color = head.color;
                    tail.time = head.time + 1;
                    d[xx][yy][head.color][tail.turn] = tail.time;
                    q.push(tail);
                }
            }
        }
    }
    return false;
}


int main() {
    int co = 0;
    while (scanf("%d%d", &m, &n) != EOF) {
        if (m == 0 && n == 0)
            break;
        co++;
        for (int i = 0; i < m; i++)
            scanf("%s", _map[i]);
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (_map[i][j] == 'S') {
                    sx = i;
                    sy = j;
                }
                else if (_map[i][j] == 'T') {
                    ex = i;
                    ey = j;
                }
                for (int k = 0; k < 5; k++) {
                    for (int kk = 0; kk < 4; kk++)
                        d[i][j][k][kk] = INF;
                }//初始化
            }
        }
        if (co != 1) {
            printf("\n");
        }
        printf("Case #%d\n", co);
        if (bfs()) {
            printf("minimum time = %d sec\n", ti);
        }
        else {
            printf("destination not reachable\n");
        }

    }
    return 0;
}



卡诺图化简法注意事项+竞争冒险知识点总结 今天反思以下卡诺图化简法中的注意事项。 卡诺图看起来简单,但如果不熟悉的话很容易出错,因此要对画圈的规则比较熟悉。 阅读详情

相关推荐

【创作赢红包】Gurobi学术版证书更新与Python环境配置全攻略

本文详细解析了Gurobi学术版证书过期后的完整更新流程与Python环境配置方法。从彻底清理旧版残留、手把手注册获取新许可证,到软件安装、证书激活,最后重点讲解如何将gurobipy接口正确配置到Python的site-packages目录,并提供了常见问题排查方案,帮助用户高效解决证书与配置难题。

efc1234567的博客 613

uva 10047 The Monocycle (BFS)

uva 10047 The Monocycle A monocycle is a cycle that runs on one wheel and the one we will be considering is a bit more special. It has a solid wheel colored with five different colors as

总有那么一群人喜欢盯着我的博客看,估计这是他们见过最长的博客名,我必须得告诉他们博客名最长可以写多长 847

python-pptx库中文文档及使用样例

个人使用样例及部分翻译自官方文档,并详细介绍chart的使用

4万+

UVA10047 UVALive2035 The Monocycle【BFS】

A monocycle is a cycle that runs on one wheel and the one we will be considering is a bit more special. It has a solid wheel colored with five different colors as shown in the figure: &nbsp;&nbsp;&nb...

海岛Blog 777

保姆级教程:用掘金量化API手把手复现一个年化17%的网格交易策略(附完整Python代码)

本文提供了一份详细的掘金量化API教程,手把手教你构建一个年化17%的网格交易策略。通过完整的Python代码实现,深入解析网格交易的核心逻辑、参数配置和动态调仓机制,帮助量化新手快速掌握策略开发全流程。教程包含环境配置、代码实现、回测分析和常见问题解答,是学习量化投资的实用指南。

weixin_33709364的博客 300

Halcon手眼标定保姆级教程:从‘眼在手上’到‘眼到手’两种模式全解析(附代码)

本文详细解析Halcon在机器人视觉引导中的手眼标定技术,涵盖Eye-in-Hand和Eye-to-Hand两种模式,提供从硬件准备到实战代码的完整解决方案。通过精确的相机标定和坐标转换,帮助实现工业自动化中机械臂与视觉系统的高精度协同作业。

weixin_42544461的博客 209

UVa10047 The Monocycle

UVa10047 The Monocycle   链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19491   (以上摘自http://blog.youkuaiyun.com/shuangde800/article/details/7686003)   【思路】   BFS。   以节点位置(x,y)方向dir

hahalidaxin的专栏 283

某城商银行生产容器云平台详细设计方案分享及经验总结

AS3模式的CIS容器部署在K8S集群内,作为F5的控制器,CIS容器通过对K8S集群内Configmap资源进行监控,将Configmap资源中的内容转化为F5的配置,将配置推送给 F5 ,CIS容器还通过K8S标准的API接口完成业务发现和实时监听集群内Pod的变化,一旦Pod发生变化,相应的更新会及时推送给F5,并完成更新。容器技术发展非常迅速,现在应用大多以容器作为承载介质,前两年在容器云上承载的应用类型主要是Web类,随着容器云领域的不断发展,越来越多的应用类型将迁移至容器云,包括有状态应用。

qq_61890005的博客 856

UVA 10047 The Monocycle

UVA-10047题意:独轮车有5个颜色,每一秒独轮车可以向前移动(面朝的方向移动一格)或者原地转90度(左右都行)。初始是绿色朝下,面向北面,初始位置为S。要求用多少秒能到达T并且还是绿色朝下。 解题思路:BFS,只不过除了常规的坐标XY之外多了方向D和颜色C。vis[x][y][d][c]。操作就是向前走一格以及左右旋转。假设初始5个颜色为01234,下一个颜色就是(c+1)%5。方向预设好移

QzNarsh的博客 346

PostgreSQL面试题及详细答案120道(101-120)

本文针对PostgreSQL数据库提供全面的性能优化方案,涵盖10个关键面试题解析。主要内容包括:1)并发参数调优(max_connections、worker_processes);2)缓存设置(effective_cache_size);3)WAL日志优化;4)慢查询监控与日志配置;5)会话管理与阻塞处理;6)高写入场景优化策略;7)存储类型参数调整;8)自动清理机制配置;9)大表DDL操作避坑指南;10)性能瓶颈诊断方法论。对DBA和开发者具有实操指导价值

大剑师兰特的GIS世界 855

PGM-Explainer实验总结

PGM-Explainer建立了一个概率图模型,为GNN提供实例级解释。 论文标题:PGM-Explainer: Probabilistic Graphical Model Explanations for Graph Neural Networks 论文地址:2010.05788.pdf (arxiv.org) PGM-Explainer实验 实验目的 研究PGM-Explainer的有效性 实验方案 合成数据集的节点分类 与其他解释器做对比实验 使用六个合成数据集。 每个输入图都是一个

笔记|思路|总结 1万+

uva10047 - The Monocycle

uva10047 - The Monocycle 一个让我想死的题目,怎么想都没有想到这个题要用广度优先搜索。而且,题目说了,能左转走,能右转走,不能倒着走。妹的,最后一想,我转2次方向,就面向背面了,相当于“往后转”。而且,“走”,和“转”要分开。 1、输入地图,初始化相关存储变量。 2、广度优先搜索,注意状态记录,“走”,和“转”要分开。 3、输出结果,判断搜索情况,搜索是否成

花花的笔记 876

Android SELinux——neverallow问题处理(十六)

遇到 neverallow 规则问题,千万别急着去注释/剔除里面原有的规则(原生的尽量别动)。增加 allow 规则是常见的解决办法,但是随着 android 版本的升级,系统对 SELinux 的管控越来越严,增加了大量的 neverallow。一般情况下,向默认标签授予权限的做法是错误的,其中许多权限都是 neverallow 规则所不允许的。按照上面方法去添加 SELinux 可能会违反了 neverallow 规则,编译时候会报 neverallow 相关的错误。

小旭的专栏 2671

uva 10047 - The Monocycle

Problem A: The Monocycle  A monocycle is a cycle that runs on one wheel and the one we will be considering is a bit more special. It has a solid wheel colored with five different colors as

uva code 1504

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

uva 10047 The Monocycle

#include #include #include #include #include using namespace std; #define N 30 char Map[N][N]; int n,m; int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; struct node{ int x,y; int steps; int dir; int c

DieOrThink 685

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Uva 10047 The Monocycle

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=988 搜索题目。 只不过把(x,y,d,c)作为一个结点。每个节点出发最多有三条边,分别对应前进、左转、右转。 #include #include #include #include

2537

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

UVA - 10047 The Monocycle(bfs)

UVA - 10047 The Monocycle(bfs) A monocycle is a cycle that runs on one wheel and the one we will be considering is a bit more special. It has a solid wheel colored with five different colors as shown ...

weixin_43179892的博客 309

UVa 10047 - The Monocycle

求从起始点能到达终点的并且颜色与初始状态相同的最短路径 bfs求最短i路问题,只不过需要记录坐标、颜色、方向三种状态 #include #include typedef struct { int x; int y; int cl; int di; int t; }node; node q[12550]; char map[30][30]; i

DC的ACM奋斗史 917

UVA 10047 Monocycle

题目大意:求独轮车到达指定点的最短时间花费。步数应为5 的倍数。visit 仅仅表示到没到过? 应该是用来表示某个状态是否出现过,用四维数组表示,时间也一样。对于t的理解无论 前进还是左右转,时间都应该只加1;方 向: 0 1 3 2transfer 边界检查,答案更新// UVa10047 The Monoc...

weixin_34290390的博客 164

The Monocycle UVA - 10047

题目链接:https://vjudge.net/problem/UVA-10047 其实蓝书上写的挺好的,用四个状态,xy坐标,朝向,颜色作为一个节点。 然后就easy了 JAVA代码 import java.util.*; import java.io.*; import java.math.*; public class Main { final static int inf=1&...

King8611的博客 333

UVA 10047 - The Monocycle(BFS)

题目链接:点击打开链接 题意:从起点到终点,每秒可以选择前进、向左、向右转, 每前进一格轮子转到下一个颜色, 一共5中颜色, 开始的时候绿色接触地面,朝北, 要求最后也绿色接触地面,求能否到达目标点以及最短时间。 思路:和普通BFS相比,多了两个附加条件,所以要将状态表示全面,也要对应加两维。 水题。 细节参见代码: #include #include #include #include

AC_Arthur的专栏 2184

UVA 10047 - The Monocycle

题目如下:  Problem A: The Monocycle  A monocycle is a cycle that runs on one wheel and the one we will be considering is a bit more special. It has a solid wheel colored with fiv

hexiecs的技术专栏 1252

uva 10047 The Monocycle

这道题目消耗了我不少时间,通过这道题目的解答,我对于广度优先搜索的理解更加深刻了,在BFS里面,每一次对于下一步状态的拓展并不是像以前的简单BFS一样仅仅局限于在位置上的更新,而应该扩展到下一步所有可能到达的状态,例如这道题里面状态由四个维度上的值决定:X坐标,Y坐标,方向,颜色,所以应该用一个四维数组来维护BFS的访问矩阵,并且我深刻理解到,每一次状态的拓展的粒度必须要分到最细,因为一开始的时候

皓首不倦 不负少年 508

The Monocycle UVA10047

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #includ

霁月难逢 彩云易散 786

Uva10047 The Monocycle

原题链接:https://vjudge.net/problem/UVA-10047 绞尽脑汁的图论题,虽然只是bfs但是要求到达的最小时间以及符合到达终点的条件还是需要思考一番。 用优先队列保证到达时间最小,每一个方块的访问方式由进入的方向以及轮子的颜色划分。 #include #define INF 0x3f3f3f3f using namespace std; int n,m; int

DlPF_C的博客 420

UVA 10047 The Monocycle

白书上图论例题2 题目大意是 M*N个格子 #不能走 S是起点 T是终点 上北下南左西右东 一开始在S,朝向北, 在每一个格子 可以左转90度 或者右转90度 或者朝向走1格 问从起点到终点 计算重复格子 走5的整数倍个格子到终点 不限制最后朝向 最短时间是多少 就像书上讲的那样 每个点 拆成20个点 (x,y,color,head) 分别表示该点的坐标,走到该点 走过

弱者要战斗 520
上一篇: POJ 3083--Children of the Candy Corn
下一篇: HDU 2544 --最短路
不如烂笔头
博客等级 码龄13年 8粉丝 39原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值