拜访
题目:现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。给定一个地图map及它的长宽n和m,其中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]; }