機器人走網格--有障礙物

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];
}



夢想還是要有的,萬一實現了呢~~~ヾ(◍°∇°◍)ノ゙~~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章