拜访

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

思路:dp的思路并不难,如果map[i][j]不能走dp[i][j]就为0,其他和此题的标准题一样(右上到左下找路径数),但是这里还有个问题,就是起始点和终点相对位置不确定,所以要是不对for循环变形的话,就得枚举所有四种情况。。。。代码会异常冗余。。。

public int countPath(int[][] map, int n, int m) {
        int[][] dp = new int[n][m];
        int x1=0,y1=0,x2=0,y2=0;
           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 dx=x1<x2?1:-1;//1代表向下走,-1代表向上走
      int dy=y1<y2?1:-1;//1代表向右走,-1代表向左走
      dp[x1][y1]=1;
      //初始化边界
       for(int i=x1+dx;i!=x2+dx;i+=dx){
           dp[i][y1]=(map[i][y1]==-1)?0:dp[i-dx][y1];
       }
       for(int i=y1+dy;i!=y2+dy;i+=dy){
           dp[x1][i]=(map[x1][i]==-1)?0:dp[x1][i-dy];
       }
        for(int i=x1+dx;i!=x2+dx;i+=dx){
            for(int j=y1+dy;j!=y2+dy;j+=dy){
                dp[i][j]=(map[i][j]==-1)?0:dp[i-dx][j]+dp[i][j-dy];
            }
        }
        return dp[x2][y2];
    }

 

posted @ 2017-04-20 22:24  雪浪snowWave  阅读(114)  评论(0编辑  收藏  举报