题目链接: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 条路径可以到达右下角。
- 向右 -> 向下 -> 向下
- 向下 -> 向下 -> 向右
- 向下 -> 向右 -> 向下
示例 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;
}