• 拜访


    题目:现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。给定一个地图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];
        }
  • 相关阅读:
    对一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。
    Java基础学习笔记四 Java基础语法
    Java基础学习笔记一 Java介绍
    Java基础学习笔记二 Java基础语法
    Elasticsearch重要配置
    Elasticsearch配置
    Elasticsearch安装详解
    Elasticsearch文档查询
    Elasticsearch索引和文档操作
    Angular4项目,默认的package.json创建及配置
  • 原文地址:https://www.cnblogs.com/team42/p/6741170.html
Copyright © 2020-2023  润新知