Recursion 二维空间里机器人向右或向下走的所有路径问题 @CareerCup

动态规划之机器人走方格 一、无障碍的网格 问题描述:   有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。给定两个正整数int x,int y表示网格的大小,计算机器人的走法数目。 求解思路:   对于本题,我们依然运用动态规划的思想。对于网格中的每一个格子,若该格子位于第一行,则只能由左边的格子到达;若格子位于第一列,只能由上面的格子到 阅读详情

这道题学到了在做回溯时,先把点加入到path中,然后根据子情况来决定success这个变量,从而决定之前加入的点是否有必要的。如果子情况返回的是false,则这个点也没有必要加入到path中,就可以移除了。

还有一个是,我的解答中每次函数只对当前点进行isFree的判断,官方答案中却对下一个节点进行判断。我还是觉得我的更直观一些。


package Recursion;

import java.awt.Point;
import java.util.ArrayList;
import java.util.Hashtable;

import CtCILibrary.AssortedMethods;

/**
 * Imagine a robot sitting on the upper left comer of an X by Ygrid. The robot
 * can only move in two directions: right and down. How many possible paths are
 * there for the robot to go from (0, 0) to (X, Y) ?
 * 
 * 在一个N*N矩阵的左上角坐着一个机器人,它只能向右运动或向下运动。那么, 机器人运动到右下角一共有多少种可能的路径?
进一步地,如果对于其中的一些格子,机器人是不能踏上去的。设计一种算法来获得所有可能的路径。
 * 
 */
public class S9_2 {

	public static int[][] maze = new int[10][10];
	
	public static void main(String[] args) {
		maze = AssortedMethods.randomMatrix(10, 10, 0, 4);
		AssortedMethods.printMatrix(maze);
		ArrayList<Point> path = new ArrayList<Point>();
		boolean success = getPathRec(9, 9, path);
		ArrayList<Point> pathRef = new ArrayList<Point>();
		boolean successRef = getPathRef(9, 9, pathRef);
		Hashtable<Point, Boolean> cache = new Hashtable<Point, Boolean>();
		ArrayList<Point> pathDP = new ArrayList<Point>();
		getPathMemo(9, 9, pathDP, cache);
		if (success) {
			String s = AssortedMethods.listOfPointsToString(path);
			System.out.println(s);
			System.out.println(AssortedMethods.listOfPointsToString(pathRef));
			System.out.println(AssortedMethods.listOfPointsToString(pathDP));
		} else {
			System.out.println("No path found.");
		}
	}
	
	// 返回是否成功获得一条路径
	public static boolean getPathRec(int x, int y, ArrayList<Point> path) {
		
		boolean free = isFree(x, y);		// 检查是否当前位置是合法的
		boolean success = false;			// 表示成功获得路径
		path.add(new Point(x, y));		// 可以采用先加入,如果后面的success为false则移除的方法!
		
		if(x==0 && y==0 && free){			// 到达初始点,找到路径
			return true;
		}
		
		if(x == 0 && free){					// 第一行
			success = getPathRec(x, y-1, path);
		}
		
		if(y == 0 && free){					// 第一列
			success = getPathRec(x-1, y, path);
		}
		
		if(x>0 && y>0 && free){			// 中间位置
			success = getPathRec(x-1, y, path);		// 先尝试往上走
			if( !success ){									// 如果往上走不得再尝试往左走
				success = getPathRec(x, y-1, path);
			}
		}
		
		if(!success){				// 如果所有尝试都失败了,证明当前节点不适合,因此移除!
			path.remove(path.size()-1);
		}
		return success;
	}
	
	public static boolean getPathMemo(int x, int y, ArrayList<Point> path, Hashtable<Point, Boolean> ht) {
		boolean free = isFree(x, y);		// 检查是否当前位置是合法的
		boolean success = false;			// 表示成功获得路径
		path.add(new Point(x, y));		// 可以采用先加入,如果后面的success为false则移除的方法!
		
		Point p = new Point(x, y);
		if(ht.contains(p)){					// 利用cache预先判断
			return ht.get(p);
		}
		
		if(x==0 && y==0 && free){			// 到达初始点,找到路径
			return true;
		}
		
		if(x == 0 && free){					// 第一行
			success = getPathMemo(x, y-1, path, ht);
		}
		
		if(y == 0 && free){					// 第一列
			success = getPathMemo(x-1, y, path, ht);
		}
		
		if(x>0 && y>0 && free){			// 中间位置
			success = getPathMemo(x-1, y, path, ht);		// 先尝试往上走
			if( !success ){									// 如果往上走不得再尝试往左走
				success = getPathMemo(x, y-1, path, ht);
			}
		}
		
		if(!success){				// 如果所有尝试都失败了,证明当前节点不适合,因此移除!
			path.remove(path.size()-1);
		}
		return success;
	}
	
	public static boolean isFree(int x, int y){
		return maze[x][y] != 0;
	}
	
	
	// 官方答案
	public static boolean getPathRef(int x, int y, ArrayList<Point> path) {
		Point p = new Point(x, y);
		path.add(p);
		if (x == 0 && y == 0) {
			return true; // found a path
		}
		boolean success = false;
		if (x >= 1 && isFree(x - 1, y)) { // Try right
			success = getPathRef(x - 1, y, path); // Free!  Go right
		}
		if (!success && y >= 1 && isFree(x, y - 1)) { // Try down
			success = getPathRef(x, y - 1, path); // Free!  Go down
		}
		if (!success) {
			path.remove(p); // Wrong way! Better stop going this way
		}
		return success;
	}

}


Unity Android平台下插件/SDK开发通用流程 本文主要面向对Android开发不甚了解的Unity开发者,介绍了基于最新的Android Studio的标准Android开发环境与项目结构的配置流程,在此基础上,开发者可以快速的进行SDK的接入与插件的开发。 阅读详情

相关推荐

Cadence HDL原理图库避坑指南:从Excel导入引脚到解决‘V- V+’报错(附FPGA实例)

本文详细介绍了Cadence HDL原理图库的高效构建与排错方法,重点讲解如何从Excel智能导入引脚数据并优化FPGA封装设计。通过数据预处理、智能导入和深度排错三个关键阶段,帮助工程师避免常见错误如‘V- V+’报错,提升设计效率和准确性。

weixin_28739079的博客 234

一个机器人只能向下和向右移动,每次只能移动一步,设计一个算法求机器人从(0,0)到(m,n)有多少条路径。

#include using namespace std; int robot(int x, int y); int main() {  int n, m;  cin >> n >> m;   cout << robot(n, m);  return 0; } int robot(int x, int y) { ...

qq_40909347的博客 1万+

贝塞尔曲线原理--曲线生成--路径规划--matlab代码

贝塞尔曲线有着很多特殊的性质, 在图形设计和路径规划中应用都非常广泛, 在路径规划中贝塞尔曲线完全由其控制点决定其形状, n个控制点对应着n-1阶的贝塞尔曲线,并且可以通过递归的方式来绘制.

bob595078694的博客 1万+

两轮差速移动机器人从A点移动到B点的C++语言代码

差动运动学模型机器人从A点移动到B点的C语言代码是一种基于位置、速度和加速度的控制算法,可以使机器人从A点移动到B点。C语言代码可以实现机器人的路径规划、速度控制和位置控制等功能。您可以使用两轮差速移动机器人的控制代码来控制它从A点移动到B点。可以使用各种语言,如C,C++,Python等来编写控制代码。从A点移动到B点的C代码应该是:moveToB(A,C);如果问出一个好问题,那么会获得惊呆的结果!好像看起来都不能用呢……

zhangrelay的专栏 2524

【LDLTS解析】从重叠峰到精准参数:拉普拉斯深能级瞬态光谱如何重塑半导体缺陷分析

本文深入解析了拉普拉斯深能级瞬态光谱(LDLTS)技术如何革新半导体缺陷分析。针对传统DLTS难以分辨重叠峰的痛点,LDLTS通过拉普拉斯逆变换对高精度电容瞬态曲线进行数学解卷积,成功分离发射率相近的缺陷信号,实现从模糊宽峰到精准独立峰的转变。该技术不仅大幅提升了缺陷激活能和捕获截面等关键参数的提取精度,更推动分析范式从经验拟合转向第一性原理,为先进半导体工艺开发与良率提升提供了强大的精准诊断工具。

weixin_29224309的博客 273

【VisDrone数据集】YOLOX训练VisDrone数据集步骤与结果

YOLOX训练VisDrone数据集步骤与结果。

Gorgeous_wxd 2233

路径规划算法C++实现(三)--DWA

一、算法介绍 DWA算法全称为dynamic window approach,其原理主要是在速度空间(v,w)中采样多组速度,并模拟出这些速度在一定时间内的运动轨迹,并通过评价函数对这些轨迹进行评价,选取最优轨迹对应的速度驱动机器人运动。 动态窗口法 DWA 的实现包含两个步骤: (1)对机器人速度进行约束限制,形成动态窗口进行速度采样; (2)根据速度采样点求出待评价轨迹,最大化评价函数选取最优速度命令。 动态窗口是由一系列的约束构成,其中约束主要包括差动机器人的非完整约束、环境障碍物约束与受结构与电机影

weixin_44504228的博客 1万+

Unity DOTS核心概念之 System(系统)

本文全面解析Unity ECS架构中System的核心概念与最佳实践。System作为纯逻辑载体,遵循"查询数据→处理数据"的工作流,严格分离数据与逻辑。文章详细介绍了: System定义方式(推荐ISystem接口)与三大设计准则(纯逻辑、无状态、最小权限) 生命周期管理(OnCreate/OnUpdate/OnDestroy)和执行顺序控制(UpdateInGroup/UpdateBefore) 实体查询机制(SystemAPI.Query高级筛选)和多线程优化(IJobEntity

分享知识,拥抱变化 182

算法 动态规划 【机器人路径问题】

目录 一、题目描述 二、思路 动态规划题目类型 1.确定状态 2.转移方程 3.初始条件和边界情况 4. 计算顺序 三、代码 一、题目描述 给定m行n列的网格,有一个机器人从左上角(0,0)出发,每一步可以向下或者向右走一步,问有多少种不同的方式走到右下角。 二、思路 动态规划题目类型 1、计数: 有多少种方式走到右下角 有多少种方法选出k个数使得和为Sum2、求最大最小值: 从左上角走到右下角路径的最大数字和 最长上升子序列长度3、求存...

Kukeoo的博客 4405

二十一、CANdelaStudio深入-SPRMIB的配置

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的肯定响应抑制位配置,欢迎各位朋友订阅、评论,可以提出宝贵意见,以持续输出更好的作品,同时会根据评论、私信不定期更新文章内容,以及专栏目录。订阅该专栏的朋友可私信小编免费答疑解惑(^U^)ノ~YO CANdelaStudio-从入门到深入目录 文章目录CANdelaStu

诊断协议那些事儿's blog 1869

PCL 基于超体素的点云分割【2024最新版】

点云超体素分割原理介绍、代码实现以及如何做到将每一个超体素内的点进行单独保存而不造成点云缺失的方法。博客长期更新,本文最近一次更新时间为:2024年12月29日。

点云侠的博客 36万+

在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。

在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在(0, 0) 处结束。 移动顺序由字符串表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有R(右),L(左),U(上)和D(下)。如果机器人在完成所有动作后返回原点,则返回 true。否则,返回 false。 注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L” 将始终向左移动等。此外,假设每次移动机器人的移动幅度相同。 示例 1: 输入...

luxuiary的博客 3865

YOLO26改进策略【Neck】| CVPR 2024 MFM(Modulation Fusion Module,调制融合模块):动态特征加权融合,突出关键特征抑制冗余

本文主要利用DCMPNet中的 MFM 模块优化 YOLO26 的目标检测网络模型。模块通过动态调制特征融合过程,实现了对多尺度、跨层级特征的智能聚合。将其应用于的改进过程中,针对目标检测中边界特征与语义信息的互补性需求,缓解网络中浅层细节与深层语义融合不足的问题。Depth Information Assisted Collaborative Mutual Promotion Network for Single Image Dehazing在图像去雾网络中,不同层级和类型的特征包含着互补的信息(如浅层的

Limiiiing的博客 221

移动机器人路径规划算法综述(二)

机器人的路径规划技术,其实是参照某一个参数 的指标( 如工作代价值最低,选择路径最短,运算时间消耗最短等) ,在任务区域选择出一条可从起点连接到终点的最优或次优的避障路径。其本质是在几个约束条件下得到最优或可行解的问题。路径规划结果的优劣,将直观地对机器人完成任务的实时性及结果优劣造成影响。 局部路径规划:基于部分区域信息理解的路径规划——局部路径规划是在机器人执行任务过程中根据自身携带传感器采集到的局部环境信息进行的实时动态路径规划,具有较高的灵活性和实时性。但由于依靠的是...

gggggg1234456的博客 8194

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

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

【剑指offer】【C++】13. 机器人的运动范围

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子? 示例 1: 输入:m = 2, n = 3, k = 1 输出:3 示例 2: 输入:m = 3

YJYS_ZHX的博客 457

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

3 移动机器人路径规划(5- DWA路径规划算法)

3 移动机器人路径规划5.1 DWA路径规划基本原理5.2 DWA路径规划流程5.3 栅格地图上绘制XY图像5.3.1 栅格地图和XY坐标系关系5.3.2 栅格行列位置转坐标系函数sub2coord.m5.3.3 栅格坐标系位置转行列位置函数coord2sub.m5.4 DWA路径规划MATLAB代码5.4.1 MATLAB效果示例5.4.2 主函数:DWA_sub.m5.4.3 函数代码:sub2coord.m和coord2sub.m5.5 DWA算法Python代码5.5.1 实现效果5.5.2 自定义

爬楼的猪的博客 6664

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

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

51Nod-1118-机器人走方格

M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。 Input 第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000) Output 输出走法的数量。 Input示例 2 3 Output示例 3这个题目可以用递归来解,如何递归呢?首先我们需要一个递推公式,对于矩阵中的

逐梦者 1707

机器人走网格---限定向下或向右走

leetcode:62. Unique Paths一、问题描述机器人位于一个m x n网格的左上角(在下图中标记为“开始”)。机器人只能随时向下或向右移动。 机器人正在尝试到达网格的右下角(在下图中标记为“完成”)。有多少可能的独特路径?m和n的值最多为100。【举例】&lt;例子1&gt;:输入: m = 3, n = 2输出: 3--解释:从3*2格子的左上角出发, 一共有三条路线到达右下角:...

qiki_糖没味儿的程序媛小屋 2082

机器人走网格

题目一:题目描述有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。给定两个正整数int x,int y,请返回机器人的走法数目。保证x+y小于等于12。 测试样例:2,2返回:2分析:这是一道动态规划题目,设二维数组dp,那么dp[i][j]为走到(i,j)的走法,那么可以得出以下的动态规划方程: dp[i][j]=dp[i-

晓风残月龙 1149

Leetcode:机器人从出发点到终点的行走的路径数目

题目描述 一个机器人在m×n大小的地图的左上角(起点,下图中的标记“start"的位置)。 机器人每次向下或向右移动。机器人要到达地图的右下角。(终点,下图中的标记“Finish"的位置)。 可以有多少种不同的路径从起点走到终点? 上图是3×7大小的地图,有多少不同的路径? 备注:m和n小于等于100 思路:动态规划算法 Java代码实现 public class Solut...

LeetCode:Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum 1272

机器人位于m x n网格的左上角(在下图中标记为“开始”) 机器人只能随时向下或向右移动。

本题源自leetcode  62 思路:动态规划  1 只能向下或者向右走。所以当在i=0 或者 j = 0时  等于1 2 dp[i] [j] = dp[i-1][j] + dp[i][j-1]; 代码: int uniquePaths(int m, int n) { vector> dp(m,vector(n,1)); for(int

i_am_bird的博客 5964

leetcode/路径的数目,机器人往下或右行走

/** * 剑指 Offer II 098. 路径的数目 * 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 * 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 * 问总共有多少条不同的路径? * * 分析 * - 注意,机器人只能往下或右走 */

求道问术 594

Leetcode:62题 不同路径(一个机器人位于一个 m x n 网格的左上角 。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角)

题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 问总共有多少条不同的路径? 用例: 3*2的方格 共3条路径; 7*3的方格 共28条路径。 思路:因为机器人每次只能向下或者向右移动一步,所以机器人在走到右下角那...

CGL1552188038的博客 8651

4318 最短路径(构造)

1. 问题描述: 有一个智能机器人,我们可以通过给它发送移动指令来控制它在一个方格矩阵地图中进行移动。 移动指令共有以下四种: U,向上移动一格距离。 D,向下移动一格距离。 L,向左移动一格距离。 R,向右移动一格距离。 矩阵地图可以无限大,矩阵地图中的方格可以是空格也可以是陷阱。机器人移动至空格则安然无恙,移动至陷阱则被摧毁。现在,机器人的移动指令已经全部设定完毕。请问,是否可以构造一个合适的矩阵地图,并选择地图中的两个不同空格位置作为起点和终点,使得:机器人能够从起点开始,按照设定好的一系列移动指令

二哈 689

人工智能实验1——二维网格空间中绕障碍物的机器人

二维网格空间中绕障碍物的机器人 预先给定机器人的目标任务,刺激响应Agent通过感知简单二维世界中的信息,作出简单的动作决策。 挺简单的,就是老师给的PPT里的规则竟然是错的,折磨了我好久,ORZ...这里贴下修改后的规则,应该是对的 代码写得比较烂,算是学习的一个记录吧。。。 1 package net.MyTest; 2 3 import javax....

weixin_30911809的博客 610

【算法】动态规划题目分析和解题步骤,例题:机器人从左上角只能向右向下到右下角有多少种不同的方式

第一次觉得动态规划题目这么清晰明了 一. 动态规划题目特点: 1.计数类 有多少种方式走到右下角 有多少种方法选出k个数使得和是sum 2.求最大最小值问题 从左上角到右下角路径的最大数字和 最长上升子序列长度 3. 求存在性 石子游戏,先手是否必胜 能不能选出k个数使得和是sum 二. 动态规划的解题步骤: 确定状态 最后一步:最优策略挪动的最后一步 子问题:比原问题规模小 转移方程 初始条件和边界情况 初始条件通常是转移方程计算不出来的所以需..

weixin_44566432的博客 1714
上一篇: 荷塘月色
下一篇: Recursion 在数组中寻找神奇下标 @CareerCup
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值