从(0,0)到(m,n),每次走一步,只能向上或者向右走

这是一道来自腾讯面试的题目,要求从(0,0)出发,每次走一步,只能向上或向右,到达(m,n)的不同路径数量。问题可以通过深度优先遍历(DFS)解决,避免陷入死循环的关键在于正确设置边界条件。" 88845488,8421681,韦尔ESD5401N-2/TR瞬态电压抑制器详解,"['半导体', '电子保护', '电路保护', 'TVS二极管', '微电子']
摘要由CSDN通过智能技术生成

从(0,0)到(m,n),每次走一步,只能向上或者向右走,有多少种路径走到(m,n)

来自腾讯的面试题。
 

 

主要是要把递归的流程分析清楚,这个问题就是一个二叉树DFS类似的问题,判断稍微复杂,每步都只能往两个方向走,右或者上,

截止条件是:0==m&&0==n

输出存储的路径,并且将total计数加1。

如果m<0||n<0

返回

否则分别走两条路:n-1,m-1

对比我原来的逻辑:

这样的话我会在第一次输出之后,m,n==0,先进入2方向分支,n-1,然后不断地进入2方向分支,进入死循环最终导致stack overflow。

我应该判断m,n是否超出边界,超出则返回,与DFS到达空指针的地方返回一样。

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
//10000时发生stackoverflow


typedef struct Coordinate
{
	int
好的,你的问题我已经记录下来了。让我来回答你的问题。 1. 以下是Java语言实现迷宫问题的代码: ```java public class Maze { private int[][] maze; // 迷宫地图 private int[][] solution; // 路径解 public Maze(int[][] maze) { this.maze = maze; this.solution = new int[maze.length][maze[0].length]; } public boolean solve(int startX, int startY, int endX, int endY) { if (startX == endX && startY == endY) { // 已经找到终 solution[startX][startY] = 1; return true; } if (maze[startX][startY] == 1 || solution[startX][startY] == 1) { // 当前位置不可达或已经过 return false; } solution[startX][startY] = 1; // 标记已经过 if (startX < maze.length - 1 && solve(startX + 1, startY, endX, endY)) { // 向下 return true; } if (startY < maze[0].length - 1 && solve(startX, startY + 1, endX, endY)) { // 向右走 return true; } if (startX > 0 && solve(startX - 1, startY, endX, endY)) { // 向上 return true; } if (startY > 0 && solve(startX, startY - 1, endX, endY)) { // 向左 return true; } solution[startX][startY] = 0; // 回溯,取消标记 return false; } public void printSolution() { for (int i = 0; i < solution.length; i++) { for (int j = 0; j < solution[0].length; j++) { System.out.print(solution[i][j] + " "); } System.out.println(); } } public static void main(String[] args) { int[][] maze = { {0, 1, 1, 1}, {0, 0, 0, 1}, {1, 1, 0, 0}, {1, 1, 1, 0} }; Maze m = new Maze(maze); m.solve(0, 0, 3, 3); m.printSolution(); } } ``` 2. 这个程序的求解思路是通过回溯法实现的,与深度优先遍历最接近。因为回溯法和深度优先遍历都是通过递归实现的。每次到一个位置时,先尝试向下、再尝试向右走、然后向上、最后向左。这个过程就是深度优先遍历。因此,这个程序的解法更接近深度优先遍历。 3. 这个程序的时间复杂度和空间复杂度都是O(n^2),其中n是迷宫的边长。因为程序需要遍历迷宫的每一个位置,所以时间复杂度为O(n^2)。另外,程序使用了一个二维数组来记录路径解,其大小也是n^2,因此空间复杂度也为O(n^2)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值