从(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 x;
int y;
}Coordinate;
#include "func.h"
Coordinate R[MAX];
int index = 0;//栈顶指针
int total = 0;//计数总共走的方法数量
void PrintStack(Coordinate R[], int index)
{
int i;
for (i = index; i>0; --i)
{
printf("%d.%d-->", R[i].x, R[i].y);
}
printf("%d.%d", R[i].x, R[i].y);
}
void Coordinate_Recursion(int m, int n,int index)
{
R[index].x = m;
R[index].y = n;
if (0 == m && 0 == n)
{
++total;
PrintStack(R, index);
printf("%5d\n", total);
}
if (m < 0 || n < 0)
return;
Coordinate_Recursion(m - 1, n,index+1);
Coordinate_Recursion(m, n - 1,index+1);
}//Coordinate_Recursion
int main(void)
{
int m, n;
while (scanf("%d %d",&m,&n)!=EOF)
{
memset(R, -1, MAX * sizeof(Coordinate));
Coordinate_Recursion(m, n,index);
total = 0;
}
system("pause");
}
这是一道来自腾讯面试的题目,要求从(0,0)出发,每次走一步,只能向上或向右,到达(m,n)的不同路径数量。问题可以通过深度优先遍历(DFS)解决,避免陷入死循环的关键在于正确设置边界条件。"
88845488,8421681,韦尔ESD5401N-2/TR瞬态电压抑制器详解,"['半导体', '电子保护', '电路保护', 'TVS二极管', '微电子']
到(m,n,每次走一步,只能向上或者向右走&spm=1001.2101.3001.5002&articleId=86032148&d=1&t=3&u=8f3d38f57fa04880bc1053ad2cebe805)
372

被折叠的 条评论
为什么被折叠?



