首页 > 代码库 > 拜访-动态规划

拜访-动态规划

现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。

给定一个地图map及它的长宽nm,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。

测试样例:
[[0,1,0],[2,0,0]],2,3
返回:2


 1 lass Visit { 2 public: 3      4     5     int countPath(vector<vector<int> > map, int n, int m) { 6         // write code here 7         int x1,y1; 8         int x2,y2; 9         for(int i=0;i<n;i++)10         {11             for(int j=0;j<m;j++)12             {13                 if(map[i][j]==1)14                 {15                     x1=i;16                     y1=j;17                 }18                 if(map[i][j]==2)19                 {20                     x2=i;y2=j;21                 }22             }23         }24         if(x1==x2&&y1==y2)25             return 0;26         int xt=x1<x2?1:-1;27         int yt=y1<y2?1:-1;28         vector<vector<int>>dp(n,vector<int>(m,1));29         for(int i=x1+xt;i!=(x2+xt);i+=xt)30         {31             dp[i][y1]=map[i][y1]==-1?0:dp[i-xt][y1];32         }33         for(int j=y1+yt;j!=(y2+yt);j+=yt)34         {35             dp[x1][j]=map[x1][j]==-1?0:dp[x1][j-yt];36         }37         for(int i=x1+xt;i!=(x2+xt);i+=xt)38        {39             for(int j=y1+yt;j!=(y2+yt);j+=yt)40             {41                 dp[i][j]=map[i][j]==-1?0:dp[i-xt][j]+dp[i][j-yt];42             }43         }44         return dp[x2][y2];45     }46 };

 

 

矩阵1

    0   0   1   0    0

    0  0    0   0    0

    0  0    0   0    0

    0  0    0   0    0

    0  0    0   2    0

 

dp

   0  0   1  1  1  0

   0  0   1  0  0  0

   0   0   1  0 0  0

   0    0  1  0  0  0

   0   0   1  0  0  0

 dp[i][j]=dp[i-1][j]+dp[i][j-1]

   0  0   1  1  1  0

   0  0   1  2  3  0

   0   0   1 3  6  0

   0    0  1  4 10  0

   0   0   1  5  15  0

拜访-动态规划