leetcode 63. Unique Paths II
一、問題描述
機器人位於一個m x n網格的左上角。機器人只能隨時向下或向右移動。機器人正在嘗試到達網格的右下角。假設網格中有障礙物,求有多少條獨特的路徑?ps:網格中的障礙物和空白區分別標記爲1和0。
【舉例】
輸入:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
輸出: 2
1. Right -> Right -> Down -> Down
2. Down -> Down -> Right -> Right
二、解題算法
1、方法一:dfs+備忘錄
/*************************************************
Author:tmw
date:2018-5-10
*************************************************/
#include <stdio.h>
#include <stdlib.h>
/**方法一:dfs+備忘錄**/
int result[1000][1000] = {0};
int dfs_Memo( int** array, int row, int col )
{
if( row < 1 || col < 1 ) return 0; /**邊界限定**/
if( array[row-1][col-1] == 1 ) return 0; /**遇到障礙**/
if( row == 1 && col == 1 ) return 1; /**起始條件**/
if( result[row][col]>0 ) return result[row][col];
else
result[row][col] = dfs_Memo(array, row-1, col)+dfs_Memo(array,row,col-1);
return result[row][col];
}
int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridRowSize, int obstacleGridColSize)
{
return dfs_Memo(obstacleGrid,obstacleGridRowSize,obstacleGridColSize);
}
2、方法二:動態規劃
/**方法二:動態規劃**/
int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridRowSize, int obstacleGridColSize)
{
/**當一開始就有障礙或者目標處就是障礙,根本走不到,則直接返回0**/
if( obstacleGrid[0][0] == 1 || obstacleGrid[obstacleGridRowSize-1][obstacleGridColSize-1] == 1 ) return 0;
int result[1000] = {0};
result[0] = 1;
int i,j;
for( i=0; i<obstacleGridRowSize; i++ )
{
for( j=0; j<obstacleGridColSize; j++ )
{
/**如果是障礙**/
if( obstacleGrid[i][j] == 1 )
result[j] = 0;
/**如果不是障礙**/
else
{
/**j==0時只有一列,保持當下的走法數**/
if( j==0 )
result[j] = result[j];
else
result[j] = result[j]+result[j-1];
}
}
}
return result[obstacleGridColSize-1];
}
夢想還是要有的,萬一實現了呢~~~ヾ(◍°∇°◍)ノ゙~~~~