机器人走步问题

四足机器人不同步态研究 ​腿式机器人的特点: (1)腿式机器人的运动轨迹是一系列离散的足印,轮式和履带式机器人的则是一条条连续的辙迹。崎岖地形中往往含有岩石、泥土、沙子甚至峭壁和陡坡等障碍物,可以稳定支撑机器人的连续路径十分有限,这意味着轮式和履带式机器人在这种地形中已经不适用。而腿式机器人运动时只需要离散的点接触地面,对这种地形的适应性较强,正因为如此,腿式机器人对环境的破坏程度也较小。 (2)腿式机器人的腿部具有多个自由度,使运动的灵活性大大增强。它可以通过调节腿的长度保持身体水平,也可以通过调节腿的伸展程度调整重心的位置 阅读详情

欢迎前往个人博客 驽马点滴 和视频空间 哔哩哔哩-《挨踢日志》

 

问题详述:一个机器人每步随机走1米或2米,求机器人走n米的方法数MethodNum(n),并列出所有的走法。

个人思考:

1.实际上MethodNum(n)=fibonacci(n+1),用数学归纳法也可证明,或者可以考虑机器人走的第一步:若是第一步走1米,走完剩下n-1米的方法数为Method(n-1);若是第一步走2米,走完剩下n-2米的方法数为Method(n-2)当然,前提是n>=3;那么Method(n)=Method(n-1)+Method(n-2),再考虑初值,Method(1)=1;Method(2)=2——可补充定义Method(0)=1;那么Method(n)对应的数列为fibonacci数列是显然的。

2.现在考虑罗列出所有的走法

想了很久最后还是决定用栈:机器人所有的走法,都可以从1,1,1,...,1这n个1组成的栈开始输出。假设栈的每个元素只能取1或者2,栈从下至上的元素排列对应机器人的一个走法。现在让栈顶元素出栈,往下加1(如果能加的话)只要产生了2,那么这个排列就一定会是新的走法(可自行验证)。如果不能加的话,要么是结束了,要么就是遇到2,那么2继续出栈。那么现在的关键是:什么情况下输出栈中所有元素?输出栈中所有元素的条件就是栈中所有元素之和为n.

#include "stdafx.h"
#include <iostream>
using namespace std;
#define MAXSIZE 100

void RobotWalkingSteps(int n);

int _tmain(int argc, _TCHAR* argv[])
{
	RobotWalkingSteps( 7 );
	return 0;
}

void RobotWalkingSteps(int n)
{
	int stack[MAXSIZE];
	//初始化栈
	for(int i = 0; i < n; ++i)
	{
		stack[i] = 1;
	}
	int top = n-1;
	int sum = n;
	while(1)
	{
		if(sum == n)
		{
			for(int i = 0; i <= top; ++i)
			{
				cout<<stack[i]<<"\t";
			}
			cout<<endl;
			//栈顶元素出栈
			sum -= stack[top];
			--top;

			//出栈后我们想要往下加1,那么得判断后面的元素,如果是2,那么继续出栈
			while(1)
			{
				if (top == -1)
				{
					//程序结束了
					cout<<"输出完毕"<<endl;
					return;
				}
				if (stack[top] == 1)
				{
					//沉到这里就得到了一个不同走法的前面几步
					++stack[top];
					++sum;
					break;//不用再往下沉了,准备把后面的几步初始为1
				}
				else
				{
					//否则的话,说明栈顶元素是2,出栈,继续往下搜索
					--top;
					sum -= 2;
				}
			}
		}
		else
		{
			//此时因为sum != n 说明我们出栈了一些元素,并且使得一个1变成2了
			for(int i = top + 1; sum < n; ++i)
			{
				stack[i] = 1;
				++top;
				++sum;
			}
		}
	}

}


 推广)

如果机器人一步可以走3米的话,那么若假设走n米的方法数为Method(n),那么Method(n)=Method(n-1)+Method(n-2)+Method(n-3).

那如何罗列出所有的走法,之前的方法同样可行吗?答案是可行的。

#include "stdafx.h"
#include <iostream>
using namespace std;
#define MAXSIZE 100

void RobotWalkingSteps(int n);

int _tmain(int argc, _TCHAR* argv[])
{
	RobotWalkingSteps( 7 );
	return 0;
}

void RobotWalkingSteps(int n)
{
	int stack[MAXSIZE];
	//初始化栈
	for(int i = 0; i < n; ++i)
	{
		stack[i] = 1;
	}
	int top = n-1;
	int sum = n;
	int countMethod = 0;
	while(1)
	{
		if(sum == n)
		{
			for(int i = 0; i <= top; ++i)
			{
				cout<<stack[i]<<"\t";
			}
			cout<<endl;
			++countMethod;
			//栈顶元素出栈
			sum -= stack[top];
			--top;

			//出栈后我们想要往下加1,那么得判断后面的元素,如果是3,那么继续出栈
			while(1)
			{
				if (top == -1)
				{
					//程序结束了
					cout<<"输出完毕"<<endl;
					cout<<countMethod<<endl;
					return;
				}
				if (stack[top] == 1)
				{
					//沉到这里就得到了一个不同走法的前面几步
					++stack[top];
					++sum;
					break;//不用再往下沉了,准备把后面的几步初始为1
				}
				else
					if (stack[top] == 2)
					{
						//沉到这里也得到了一个不同走法的前面几步
						++stack[top];
						++sum;
						break;//不用往下沉了,准备把后面的几步初始为1
					}
					else
					{
						//否则的话,说明栈顶元素是3,出栈,继续往下搜索
						sum -= stack[top];
						--top;
					}
			}
		}
		else
		{
			//此时因为sum != n 说明我们出栈了一些元素,并且使得一些元素发生改变了
			for(int i = top + 1; sum < n; ++i)
			{
				stack[i] = 1;
				++top;
				++sum;
			}
		}
	}
}


 事实上,走步问题对应着一个逢K进位的表达序列,其和为n,那么其中的判断语句可以用下面的形式表示:

 

void RobotWalkingSteps(int n)
{
	int stack[MAXSIZE];
	//初始化栈
	for(int i = 0; i < n; ++i)
	{
		stack[i] = 1;
	}
	int top = n-1;
	int sum = n;
	int countMethod = 0;
	while(1)
	{
		if(sum == n)
		{
			for(int i = 0; i <= top; ++i)
			{
				cout<<stack[i]<<"\t";
			}
			cout<<endl;
			++countMethod;
			//栈顶元素出栈
			sum -= stack[top];
			--top;

			//出栈后我们想要往下加1,那么得判断后面的元素,如果是K,那么继续出栈
			while(1)
			{
				if (top == -1)
				{
					//程序结束了
					cout<<"输出完毕"<<endl;
					cout<<countMethod<<endl;
					return;
				}
				if (stack[top] == K)
				{
					//出栈,继续往下搜索
					sum -= stack[top];
					--top;
				}
				else
				{
					//说明栈顶元素可以+1,得到了一个不同走法的前面几步
					++stack[top];
					++sum;
					break;//不用往下沉了,准备把后面的几步初始为1
				}
			}
		}
		else
		{
			//此时因为sum != n 说明我们出栈了一些元素,并且使得一些元素发生改变了
			for(int i = top + 1; sum < n; ++i)
			{
				stack[i] = 1;
				++top;
				++sum;
			}
		}
	}
}

 

 

欢迎前往个人博客 驽马点滴 和视频空间 哔哩哔哩-《挨踢日志》

 

 

人形机器人建模与控制(六) - 行走控制 腿式机器人在复杂地形中行走的能力使其成为探索、救援和军事等领域的重要研究对象。在本篇博文中,我们将探讨腿式机器人行走周期、行走运动公式、零力矩点(ZMP)和模型预测控制(MPC)等相关理论与实践方法。 阅读详情

相关推荐

机器人走步问题或爬楼问题加强

机器人每步走1米或2米或3米,罗列出走n米的方法 或者爬楼,每次1个台阶或2个台阶或3个台阶,罗列出走n个台阶的方法。 这里使用栈来解决

动态规划:机器人走n米有多少种走法问题

最近算法实验中的一个题目,特此分享一下解法。 题目,算法思路,代码如下:/* * 题目: * 一个机器人每步可以走 1 米、2 米或 3 米。 * 编写一个动态规划算法,计算机器人走n 米,有多少种走法(考虑步骤的次序)。 * * * 算法思路: * 设总路程为n米,共有s(n)种走法 * * 假设初值s(0) = 1 * 易知s(1) = 1 s(2) = 2 * 可以

Jymn_Chen 7374

放苹果问题

放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18538 Accepted: 11749 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 Input 第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。 Output 对输入的每组数据M和N,用一行输出相应的K。 Sample Input 1 7 3 Sample Output 8

机器人行走问题

某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。  * 小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字)。     例如,我们可以对小车输入如下的指令     15L10R5LRR10R20     则,小车先直行15厘米,左转,再走10厘米,再右转,...     不难看出,对于此指令串,小车又回到了出发地。     你的

您已进入防沉迷系统... 1019

机器人走步问题或者爬楼梯问题

机器人每步走1米或2米,罗列出走n米的方法(方法有fibonacci(n+1)个) 或者爬楼,每次1个台阶或2个台阶,罗列出走n个台阶的方法。 这里使用栈来解决,算法复杂度为O(fibonacci(n))

HFSS螺旋线圈的设计与仿真

undefined.全局变量在这里进行设置:Project/Project Properties, browse and setup the global variables.undefined.方程中的局部变量设置:HFSS/Design Properties, browse and setup the local variables。按照下图填写曲线的方程内容:fill the parameters according to the setup in the following picture。

johnboat的专栏 3845

每日一小题

机器人一次可以走1m,2m或3m。编写一个动态规划算法求机器人走n米有多少种走法 简单的一种递推思想 当n 1时,只有一种解法 当n 2时,有两种。 当n == 3时,有四种。 1 1 1,2 1,1 2 ,3. 当n4时,有七种。 1 1 1 1,1 3 ,3 1,2 2,2 1 1,1 1 2,1 2 1. 当n5时,有十三种。 1 1 1 1 1,1 1 1 1 2,1 1 2 1,1 2 1 1,2 1 1 1, 1 2 2,2 1 2,2 2 1,1 1 3, 1 3 1 ,3 1 1, 3 2

zmm0628的博客 906

视频预处理--经典方法卷积3D

在三维卷积操作中,卷积核不仅在空间维度上滑动,还在时间维度上滑动,从而同时捕捉时间和空间上的特征。通过合理设置步长和填充,可以灵活控制输出特征图的大小和特征提取的效果。你的理解非常准确:三维卷积核就像是一个长度为 3 的滑动窗口,每次选取 3 个连续的帧进行卷积操作,而步长和填充则进一步优化了这一过程。

m0_73359068的博客 1649

智能机器人走迷宫c语言游戏,(动态规划)机器人走迷宫问题(示例代码)

题目一:https://www.nowcoder.com/practice/166eaff8439d4cd898e3ba933fbc6358?tpId=46&tqId=29117&tPage=1&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking题目翻译:机器人位于m x n网格的左上角(在下图中标记...

weixin_39621870的博客 1430

黑群晖二合一已损毁_手动修复黑群晖已损毁磁盘空间

lz的用法是这样的,一个中古级mac mini 2011上装有vmware esxi 7.6, 然后上面挂载了lz的华芸Asustor Nas的iscsi空间,lz用的是basic volume,然后esxi上面有虚拟的黑群晖6.2.2-24922,黑群晖的docker里跑着不可描述软件,但是发现下载速度过快时,比如有好几个文件同时下载,总速度超过60MB/s以后storage manager里很...

weixin_39669629的博客 1万+

基于PSO-BP神经网络的风电功率预测研究论文复现

风电功率预测。基于PSO-BP神经网络的风电功率预测论文复现。matlab程序,注释清晰。

weixin_825487230的博客 2295

19.1:机器人走步问题

19.1:机器人走步问题

深入探索技术领域,持续学习成长,追求实践与进步,共同构建技术未来 389

CAPL编程规范与最佳实践

通过本文的学习,读者应该对CAPL编程规范与最佳实践有了初步的了解,并能够编写高质量的CAPL脚本。在实际项目中,CAPL的应用非常广泛,希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1747

【Leetcode】机器人到达指定位置方法数 (动态规划)

Foreword 原版是 https://www.notion.so/bryce1010/2b4b9e98bb34422084d3cf3f84534df3,原版查看体验更佳。 Resources 《程序员代码面试指南》 《OI wiki dp部分》 《labuladong动态规划详解》 题目 假设有排成一行的N个位置,记为1~N,N一定大于等于2.开始时机器人在其中的M位置上,机器人可以往左走,也可以往右走,如果机器人来到1位置,那么下一步只能往右来到2位置;如果机器人来到N位置,那么下一步只能往左来到

Bryce1010's Blog 1324

解决【x2openEuler环境检查未通过——CheckRepoCurlActor不通过】问题

摘要:x2openEuler使用默认repo源时出现环境检查失败问题,原因是默认源返回308永久重定向错误。解决方法包括:1)为CentOS主机配置华为yum源;2)在x2openEuler Web界面修改为自定义可用源。具体步骤包括备份原源、下载华为源、清除缓存,并通过curl测试确认新源可用性。最终成功配置openEuler-24.03-LTS-SP1版本的repo源后,环境检查顺利通过。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 258

PCL 提取两片点云的非重叠部分【2025最新版】

PCL 提取两片点云的非重叠部分。博客长期更新,本文最近一次更新时间为:2025年9月1日。

点云侠的博客 36万+

动态规划及经典题解

给定一个数组表示每个人喝完咖啡准备刷杯子的时间,一次只能洗一个,用时3,杯子也可以自己挥发干净,需要时间为10,可以并行挥发,返回所有杯子干净的最早时间。//这个数之前已经算过。//dp[i][j] str1[0~i] str2[0~j]公共最长子序列。//返回[index,drinks.size()-1]变干净的最早时间。//[index + 1, size() - 1]变干净的最早时间。//[index+1,size()-1]变干净的最早时间。//3)公共最长子序列不以 i结尾,以j结尾。

Hi,我是 JackYang,一名热爱编码的程序员。这个博客主要记录我的开发笔记、技术心得以及在项目实践中的经验总结。 705

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

bfs 与优先队列————洛谷p1126(历经两个小时总算AC了,哭晕)

机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径1.6米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个N×M的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。1Creep2Walk3RunLeftRight每个指令所需要的时间为1秒。请你计算一下机器人完成任务所需的最少时间。

2301_80093604的博客 754

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

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Broken robot

Broken robot 在\(n\times m\)的网格上,有一个机器人在\((x,y)\)上,它可以等概率选择向下向右向左移动,或者停留原地,询问机器人到第n行的所走的步数的数学期望, \(1<=n,m<=1000\)。 解 易知数学期望题目,而样本空间无限大,考虑有后效性递推,设\(f[x][y]\)表示机器人从(x,y)到最后一行的所走步数的数学期望,不难有 \[if(y==...

weixin_33735077的博客 251

动态规划-从暴力搜所到备忘录再到递推

动态规划-从暴力搜所到备忘录再到递推题目描述暴力递归:改进1 备忘录方法(也叫记忆搜索法)改进2 递推式的方法(也叫位置依赖法)总结 题目描述 假设有排成一行的N个位置,记为1-N,N一定大于等于2 开始时机器人在其中的current位置上(current一定时1-N中的一个) 如果机器人来到1位置,那么下一步只能来到2位置 如果机器人来到N位置,那么下一步只能来到N-1位置 如果机器人来到中间位置,那么下一步可以往左走一步,也可以往右走一步 规定机器人必须走step步,最终能来到aim位置(aim也是1

褪色的博客 544

从暴力递归到动态规划

动态规划:从暴力递归到动态规划一步一个脚印,分享了几个简单题,大家多指教。

qq_61318323的博客 322

Blender图解教程:完整走步循环(Walk Cycle)的制作过程(12月1日完结)

博主声明:本文由开发游戏的老王原创,未经允许谢绝转载 博客主页:https://orzgame.blog.youkuaiyun.com 欢迎点赞收藏留言如有错误敬请指正!

开发游戏的老王 4691

暴力递归与动态规划

存在多个单元格,current表示现在所处的单元格,n表示单元格格数,aim表示目标单元格,rest表示剩余步数,求当剩余步数为0时,机器人能到达aim的方法数;有的子问题重复,可将此子问题记录下来,下次能够用到。由暴力递归到动态规划;

qijingbo_的博客 105

【dp】——随机的机器人

题目来自牛客网: 【随机的机器人】有一条无限长的纸带,分割成一系列的格子,最开始所有格子初始是白色。现在在一个格子上放上一个萌萌的机器人(放上的这个格子也会被染红),机 器人一旦走到某个格子上,就会把这个格子涂成红色。现在给出一个整数n,机器人现在会在纸带上走n步。每一步,机器人都会向左或者向右走一个格子,两种情况概率相等。机器人做出的所有随机选择都是独立的。现在需要计算出最后纸带上红色格子的...

Shrimp_millet 449
上一篇: 输出2-n的所有素数
下一篇: Matlab实现——to find the fixed point
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值