平面移动乌龟

这篇博客讨论了如何在C语言中模拟LOGO语言中的小乌龟移动,包括前进、后退、左转和右转四种操作,并介绍了输入输出格式及示例。文章强调了坐标和方向判断在解决问题中的关键作用。

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

题目

LOGO语言中有一只可爱的小乌龟可以前后左右移动,在C语言中也有一个可爱的小乌龟。小乌龟的起始位置称为原点,小乌龟初始时头朝上方,状态如下图所示,我们规定它初始的面朝方向为y轴正方向,尾巴方向为y轴负方向,左右分别为x轴负方向和正方向。

图片1.png

现在以0,1分别代表x,y轴正方向,2,3分别代表x,y轴负方向,它们是绝对方向。而小乌龟只会沿着与绝对方向xy轴平行的方向行走,但是小乌龟不知道自己现在走到哪了,不知道自己在xy平面坐标系中的绝对坐标和自己头朝向的绝对方向。

小乌龟有以下四种移动方式,每种移动方式先给出一组字符代表移动方式,之后是一个空格隔开的x,代表移动x米。

forward x  向前走x米。

back x    调转方向向后,再走x米。

left x      调转方向向左,再走x米。

right x     调转方向向右,再走x米。

输入格式

第一行一个正整数m(10<=m<=100),表示测试数据的组数。每组测试数据第一行是一个正整数n(1<=n<=10000)表示小乌龟行走的次数,下面n行每行输入一次相对行走,格式如上所述,其中( 1 <= x <= 10000为正整数)。并且小乌龟走完每组数据后会自动回到初始点回到原始状态,等待执行下一组数据。

输出格式

对于每组输入数据输出一行,x y p, 中间用空格隔开,x y 是小乌龟停下位置的绝对坐标,p是小乌龟头朝向的绝对方向编号(0<=p <=3)。

输入格式

第一行一个正整数m(10<=m<=100),表示测试数据的组数。每组测试数据第一行是一个正整数n(1<=n<=10000)表示小乌龟行走的次数,下面n行每行输入一次相对行走,格式如上所述,其中( 1 <= x <= 10000为正整数)。并且小乌龟走完每组数据后会自动回到初始点回到原始状态,等待执行下一组数据。

输出格式

对于每组输入数据输出一行,x y p, 中间用空格隔开,x y 是小乌龟停下位置的绝对坐标,p是小乌龟头朝向的绝对方向编号(0<=p <=3)。

输入/输出例子

输入:

1

4

left 10

right 11

forward 12

back 13

输出:

-10 10 3

 正如题目所说

我们要输出小海龟的坐标,和区域。

像这些命令,都要用string类型存起来,然后将读进去的数与其比较,构建平面直角坐标系,从而得出答案。

#include<bits/stdc++.h>
using namespace std;
int main(){
    //freopen("p.in","r",stdin);
    //freopen("p.out","w",stdout);
    int m;
    scanf ("%d",&m);
    while (m--){//多组数据
        int n;
        scanf ("%d",&n);
        int x=0,y=0,f=1;
        for (int i=0;i<n;i++){
            string a;int s;
            cin>>a>>s;
            if (a=="back") f=(f+2)%4;//预处理,也是方向
            if (a=="left") f=(f+1)%4;
            if (a=="right") f=(f-1+4)%4;
            switch (f){  //代码关键句模拟
            case 1:{y+=s;break;}
            case 3:{y-=s;break;}
            case 2:{x-=s;break;}
            case 0:{x+=s;break;}
}
}
    printf ("%d %d %d",x,y,f);
}
    return 0;
}

我感觉也没有什么特别难的,主要还是方向区域的判断。

### 关于 ROS Turtlesim 的代码示例 Turtlesim 是 ROS 中的一个经典教学工具包,用于模拟一个小海龟在二维平面移动。它是一个简单而直观的学习资源,适合初学者理解 ROS 基本概念,例如节点、话题、服务和参数。 以下是关于如何启动并控制小海龟仿真以及一些基本操作的说明: #### 启动 Turtlesim 节点 通过运行以下命令可以启动 `turtlesim` 和键盘控制器节点: ```bash ros2 run turtlesim turtlesim_node ros2 run turtlesim turtle_teleop_key ``` 上述两条命令分别启动了一个图形界面窗口显示小海龟的位置[^1],另一个允许用户通过键盘箭头键来控制小海龟的方向和速度。 #### 发布消息到 `/turtle1/cmd_vel` 主题 为了实现更复杂的运动逻辑,可以通过发布 Twist 类型的消息至主题 `/turtle1/cmd_vel` 来手动控制小海龟的速度和方向。下面是一段 Python 示例代码展示如何编写自定义脚本来完成这一功能: ```python import rclpy from geometry_msgs.msg import Twist from rclpy.node import Node class MoveTurtle(Node): def __init__(self): super().__init__('move_turtle') self.publisher_ = self.create_publisher(Twist, '/turtle1/cmd_vel', 10) timer_period = 0.5 # seconds self.timer = self.create_timer(timer_period, self.timer_callback) def timer_callback(self): msg = Twist() msg.linear.x = 2.0 msg.angular.z = 1.0 self.publisher_.publish(msg) def main(args=None): rclpy.init(args=args) move_turtle = MoveTurtle() rclpy.spin(move_turtle) move_turtle.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 此代码创建了一个名为 `move_turtle` 的 ROS2 节点,并周期性地向 `/turtle1/cmd_vel` 主题发送线性和角速度指令[^3]。 #### 使用 roslaunch 文件配置多个节点 如果希望简化多节点的启动过程,还可以利用 `.launch` 文件一次性加载所有必要的组件。例如,在 TurtleBot3 SLAM 配置中使用的 launch 文件如下所示: ```xml <launch> <include file="$(find turtlebot3_bringup)/launch/turtlebot3_state_publisher.launch"/> <node pkg="turtlesim" type="turtlesim_node" name="sim"/> </launch> ``` 注意这里仅作为示范用途;实际应用可能涉及更多复杂设置如传感器数据融合等[^2]。 ### 总结 以上介绍了有关 ROS Turtlesim 包的基础教程及其典型应用场景下的编程实践方法。对于新手来说这是非常宝贵的入门资料之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值