码迷,mamicode.com
首页 > 其他好文 > 详细

牛客网

时间:2016-08-22 21:20:04      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

[编程题]拜访

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

给定一个地图map及它的长宽nm,其中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, y1, x2, 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;}
        int nx = std::abs(x1 - x2)+1;
        int ny = std::abs(y1 - y2)+1;
        vector<vector<int> > count(nx, vector<int>(ny, 0));
         
        count[0][0] = 1;
        for(int i = 1; i < nx; ++i)
            if(map[x1+((x2>x1)?i:-i)][y1] != -1)
                count[i][0] = count[i-1][0];
        for(int i = 1; i < ny; ++i)
            if(map[x1][y1+((y2>y1)?i:-i)] != -1)
                count[0][i] = count[0][i-1];
             
        for(int i = 1; i < nx; ++i)
            for(int j = 1; j < ny; ++j)
                if(map[x1+((x2>x1)?i:-i)][y2+((y2>y1)?j:-j)] != -1)
                    count[i][j] = count[i-1][j] + count[i][j-1];
             
        return count[nx-1][ny-1];
    }
};

 

牛客网

标签:

原文地址:http://www.cnblogs.com/qiaozhoulin/p/5796952.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!