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