力扣62不同路径——dp(一维与二维),dfs,bfs三种解法

这篇博客探讨了如何解决一个机器人在网格中找到不同路径的问题。通过使用动态规划(二维和一维数组实现)以及深度优先搜索(DFS)和广度优先搜索(BFS),博主展示了多种算法来计算从起点到终点的不同路径数量。示例代码展示了每种方法的实现,并给出了不同输入的示例输出。
摘要由CSDN通过智能技术生成

题目链接:https://leetcode-cn.com/problems/unique-paths/

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

问总共有多少条不同的路径?

示例 1:

在这里插入图片描述

输入:m = 3, n = 7
输出:28
示例 2:

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。

  1. 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向下
    示例 3:

输入:m = 7, n = 3
输出:28
示例 4:

输入:m = 3, n = 3
输出:6

提示:

1 <= m, n <= 100
题目数据保证答案小于等于 2 * 109

二维dp:
状态转移方程:dp【i】【j】=dp【i-1】【j】+dp【i】【j-1】

#include <stdio.h>
#include <stdlib.h>
#define N 103

/*int uniquePaths(int m, int n)
{
    int dp[103][103];
    int i,j;
    for(i=0;i<n;i++)
        dp[0][i]=1;
    for(i=0;i<m;i++)
        dp[i][0]=1;

    for(i=1;i<m;i++)
        for(j=1;j<n;j++)
        dp[i][j]=dp[i-1][j]+dp[i][j-1];
    return dp[m-1][n-1];
}*/

int main()
{
    int dp[N][N];
    int i,j,m,n;
    scanf("%d%d",&m,&n);

    for(i=0;i<n;i++)
        dp[0][i]=1;
    for(i=0;i<m;i++)
        dp[i][0]=1;

    for(i=1;i<m;i++)
        for(j=1;j<n;j++)
        dp[i][j]=dp[i-1][j]+dp[i][j-1];

    printf("%d",dp[m-1][n-1]);
    //printf("%d",uniquePaths(m,n));

    return 0;
}

一维dp:

#include <stdio.h>
#include <stdlib.h>

int uniquePaths(int m, int n)
{
    int dp[103],i,j;
    for(i=0;i<n;i++)
        dp[i]=1;

    for(i=1;i<m;i++)
        for(j=1;j<n;j++)
        dp[j]=dp[j-1]+dp[j];

    return dp[n-1];
}

int main()
{
    int n,m;
    while(~scanf("%d%d",&m,&n))
    {
        printf("%d\n",uniquePaths(m,n));
    }
    return 0;
}

DFS

#include <stdio.h>
#include <stdlib.h>
//由于只向下和右走所以不用标记

int count,m,n;
int dir[2][2]={{1,0},{0,1}};

void DFS(int x,int y)
{
    int xx,yy;
    if(x==m-1 && y==n-1)
    {
        count++;
        return;
    }
    for(int i=0;i<2;i++)
    {
        xx=x+dir[i][0];   //不能改变x的值下个循坏还要用x
        yy=y+dir[i][1];
        if(xx<m && yy<n)
            DFS(xx,yy);
    }
}

int main()
{
    scanf("%d%d",&m,&n);
    DFS(0,0);
    printf("%d",count);
    return 0;
}

BFS

#include <stdio.h>
#include <stdlib.h>
#define N 103
//int vis[103][103];求最短路径才要标记,多个路径不需要标记不然会出错
int dir[2][2]={ {1,0},{0,1} };
typedef struct node
{
    int x;
    int y;
    struct node *next;
}Node;

typedef struct
{
    Node * front;  //头指针
    Node * rear;   //尾指针
    int size;
}Queue;

void InitQueue(Queue *q)
{
    q->front = NULL;
    q->rear = NULL;
    q->size = 0;
}

int QueueIsEmpty(Queue *q)
{
    if(q->size==0)
        return 1;
    else
        return 0;
}

void EnQueue(Queue *q,int x,int y)
{
    Node *pnew = (Node *)malloc(sizeof(Node));
    pnew->next = NULL;
    pnew->x = x;
    pnew->y = y;

    if(QueueIsEmpty(q))
        q->front = pnew;
    else
        q->rear->next = pnew;
    q->rear = pnew;
    q->size++;
}

void DeQueue(Queue *q,Node *temp)
{
    Node * psave = q->front;
    q->front = q->front->next;
    *temp = *psave;
    q->size--;
    if(QueueIsEmpty(q))
        q->rear = NULL;
    free(psave);
}

int BFS(int m,int n)
{
    int x,y,count=0;
    Queue q;
    Node temp;
    InitQueue(&q);

    EnQueue(&q,0,0);
    while(!QueueIsEmpty(&q))
    {
        DeQueue(&q,&temp);
        if(temp.x==m-1 && temp.y==n-1)
              count++;
        for(int i=0;i<2;i++)
        {
            x=temp.x+dir[i][0];
            y=temp.y+dir[i][1];
            if(x<m && y<n ){
                EnQueue(&q,x,y);
            }
        }
    }
    return count;
}

int main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    printf("%d",BFS(m,n));
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值