动态规划拜访

题目描述
现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。
给定一个地图map及它的长宽n和m,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。
测试样例:
[[0,1,0],[2,0,0]],2,3
返回:2

class Visit {
public:
    int countPath(vector<vector<int> > map, int n, int m) {
        // write code here
        int x1, x2, y1, y2;

        for (int i = 0; i < n ; i++)
        {
            for (int j = 0; j < m; j++)
            {
                if (map[i][j] == 1)
                {
                    x1 = i;
                    y1 = j;
                }
                else if (map[i][j] == 2)
                {
                    x2 = i;
                    y2 = j;
                }
            }
        }

        vector<vector<int>> count(n,vector<int>(m,1));
        int dx = x1 < x2 ? 1 : -1;
        int dy = y1 < y2 ? 1 : -1;

        for (int i = x1 + dx; i != x2 + dx; i += dx)
        {
            for (int j = y1 + dy; j != y2 + dy; j += dy)
            {
                if (map[i][j] == -1)
                    count[i][j] = 0;
                else
                    count[i][j] = count[i - dx][j] + count[i][j - dy];
            }
        }

        return count[x2][y2];
    }
};

机器人障碍走方格
题目描述
有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。注意这次的网格中有些障碍点是不能走的。
给定一个int[][] map(C++ 中为vector >),表示网格图,若map[i][j]为1则说明该点不是障碍点,否则则为障碍。另外给定int x,int y,表示网格的大小。请返回机器人从(0,0)走到(x - 1,y - 1)的走法数,为了防止溢出,请将结果Mod 1000000007。保证x和y均小于等于50

class Robot {
public:
    int countWays(vector<vector<int> > map, int x, int y) {
         if(map.size() != x || map[0].size() != y)
        {
            return 0;
        }
        int dp[100][100]={0};
       dp[0][0] = 1;
         for(int i=0;i//dp[i][j]的方法,等于走到上面一格和走到左边一个方法之和。
              for(int j=0;jif(map[i][j] != 1) 
                  {
                      dp[i][j]=0;
                       continue;
                  }
                  if(i == 0 || j == 0)
                  {
                      if(i == 0 && j != 0)
                      {
                          dp[i][j] = dp[i][j-1];
                      }
                       if(i != 0 && j == 0)
                      {
                          dp[i][j] = dp[i-1][j];
                      }
                      continue;
                  }
                  dp[i][j]=(dp[i-1][j]+dp[i][j-1])%1000000007;

              }
         return dp[x-1][y-1];      

    }
};

你可能感兴趣的:(动态规划,校招编程题)