leetcode-Unique Paths II-63

输入一个矩阵,0代表能走,1代表不能走,求从左上角走到右下角有多少种走法,和上题差不多,主思路还是从右下角开始填数字,然后a[i][j]=a[i+1][j]+a[i][j+1],

不过多了对能不能走的判断,这里我先把不能走的处理成INT_MAX,如果一个格子的下和右都能走,那么下+右,否则min(下,右)

 1 class Solution {
 2 public:
 3     int uniquePathsWithObstacles(vector<vector<int> >& a) {
 4         if(a.size()==0) return 0;
 5         for(int i=0;i<a.size();i++){
 6             for(int j=0;j<a[i].size();j++){
 7                 if(a[i][j]==1) a[i][j]=INT_MAX;
 8             }
 9         }
10         int m=a.size();
11         int n=a[0].size();
12         if(a[m-1][n-1]==INT_MAX) return 0;
13         a[m-1][n-1]=1;
14         for(int i=m-2;i>=0;i--){
15             if(a[i][n-1]==INT_MAX) continue;
16             a[i][n-1]=a[i+1][n-1];
17         } 
18         for(int i=n-2;i>=0;i--){
19             if(a[m-1][i]==INT_MAX) continue;
20             a[m-1][i]=a[m-1][i+1];
21         }
22         for(int i=m-2;i>=0;i--){
23             for(int j=n-2;j>=0;j--){
24                 if(a[i][j]==INT_MAX) continue;
25                 if(a[i+1][j]!=INT_MAX&&a[i][j+1]!=INT_MAX) a[i][j]=a[i+1][j]+a[i][j+1];
26                 else a[i][j]=min(a[i+1][j],a[i][j+1]);
27             }
28         }
29         if(a[0][0]==INT_MAX) return 0;
30         return a[0][0];
31     }
32 };

 

posted @ 2016-08-30 21:23  0_summer  阅读(154)  评论(0编辑  收藏  举报