62. 不同路径;

62. 不同路径

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

  • 这不是和高中的题目是一样的吗
  • 高中时候是站在点上啊
  • 现在是站在方框里了
  • 你看一共要走3步
  • 只有1步是向右边的
  • 所以就是 C 3 1 = 3 C_3^1=3

  • 这道题答案就是 C m + n 2 m 1 C_{m+n-2}^{m-1}

  • 答案很简单啊

int uniquePaths(int m, int n){
    int  (*B)[n]=(int (*)[n])malloc(sizeof(int)*m*n);
    memset(B,0,sizeof(int)*m*n);
    B[0][0] =1;
    for (int i=0;i<m;i++)
        for (int j=0;j<n;j++)
        {
            if(i-1>=0)
                B[i][j]=B[i-1][j];
            if(j-1>=0)
                B[i][j]+=B[i][j-1];
            
        }
    //free(B);
    return B[m-1][n-1];
}

baidu面试题

  • m x n 网格的左上角
  • 每次向下或者向右移一步。
  • 试图达到网格的右下角。
  • 网格中有障碍物(值为1)。
  • 从左上角到右下角将会有多少条不同路径?

输入: [
[0,0,0],
[0,1,0],
[0,0,0]
]
输出: 2

  • 哎,我刚开始还说DFS呢。。。

  • 这个是循环版本的

#include <stdio.h>

#define M 3
#define N 3
static int A[M][N];
static int B[M][N];

void rec(int m,int n)
{
	B[0][0] = 1;
	for (int i=0;i<M;i++)
		for (int j = 0; j < N; j++)
		{
			if (i - 1 >= 0 && A[i-1][j]!=1)
			{
				B[i][j] = B[i - 1][j] ;
			}
			if (j - 1 >= 0 && A[i][j-1] != 1)
			{
				B[i][j] +=B[i][j - 1];
			}

		}
}

int main()
{
	A[0][0] = 0;
	A[0][1] = 0;
	A[0][2] = 0;
	A[1][0] = 0;
	A[1][1] = 1;
	A[1][2] = 0;
	A[2][0] = 0;
	A[2][1] = 0;
	A[2][2] = 0;

	rec(M-1, N-1);

	printf("%d\n",B[M-1][N-1]);
	return 0;
}
  • 递归版本呢??

这个递归版本是对的啊



#include <stdio.h>

#define M 3
#define N 3
static int A[M][N];

int rec(int m,int n)
{
	if (m == 0 && n == 0)
	{
		return 1;
	}
		
	int res1=0;
	int res2=0;

	if (m - 1 >= 0 && A[m - 1][n] != 1)
		res1 = rec(m - 1, n);
		
	if (n - 1 >= 0 && A[m][n-1] != 1)
		res2 = rec(m , n-1);
	return res1 + res2;
}


int main()
{
	A[0][0] = 0;
	A[0][1] = 0;
	A[0][2] = 0;
	A[1][0] = 0;
	A[1][1] = 1;
	A[1][2] = 0;
	A[2][0] = 0;
	A[2][1] = 0;
	A[2][2] = 0;


	printf("%d\n", rec(M - 1, N - 1));
	return 0;
}

这个递归版本版本是错的


#include <stdio.h>

#define M 3
#define N 3
static int A[M][N];
static int B[M][N];

void rec(int m,int n)
{
	if (m == 0 && n == 0)
	{
		B[m][n] = 1;
		return;
	}
		
	if (m - 1 >= 0 && A[m - 1][n] != 1)
		rec(m - 1, n);
		
	if (n - 1 >= 0 && A[m][n-1] != 1)
		rec(m , n-1);
	if (m - 1 >= 0)
		B[m][n] = B[m - 1][n];
	if (n - 1 >= 0)
		B[m][n] += B[m ][n-1];

}


int main()
{
	A[0][0] = 0;
	A[0][1] = 0;
	A[0][2] = 0;
	A[1][0] = 0;
	A[1][1] = 0;
	A[1][2] = 0;
	A[2][0] = 0;
	A[2][1] = 0;
	A[2][2] = 0;

	rec(M-1, N-1);

	printf("%d\n",B[M-1][N-1]);
	return 0;
}

  • 原因在于你有可能重复了求某些B
  • 例如B[1][1]

聪明的我发现只要加上B[m][n] = 0;就可以啦


#include <stdio.h>

#define M 3
#define N 3
static int A[M][N];
static int B[M][N];

void rec(int m,int n)
{
	if (m == 0 && n == 0)
	{
		B[m][n] = 1;
		return;
	}
		
	if (m - 1 >= 0 && A[m - 1][n] != 1)
		rec(m - 1, n);
		
	if (n - 1 >= 0 && A[m][n-1] != 1)
		rec(m , n-1);
	B[m][n] = 0;
	if (m - 1 >= 0)
		B[m][n] = B[m - 1][n];
	if (n - 1 >= 0)
		B[m][n] += B[m ][n-1];

}


int main()
{
	A[0][0] = 0;
	A[0][1] = 0;
	A[0][2] = 0;
	A[1][0] = 0;
	A[1][1] = 0;
	A[1][2] = 0;
	A[2][0] = 0;
	A[2][1] = 0;
	A[2][2] = 0;

	rec(M-1, N-1);

	printf("%d\n",B[M-1][N-1]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zhoutianzi12/article/details/107639983