题目描述
现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。
给定一个地图map及它的长宽n和m,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。
测试样例:
[[0,1,0],[2,0,0]],2,3
返回:2
乍一看这个题目是个水水的题。深度优先遍历就能解决。但是要注意几个情况。
经理在选择向左向右之后遍历不能改变。以后每次只能向左。。
第二就是如果2在1的同行或者同列。那么结果要取半。因为如果是在一列的话(假设在下面),那么(左下,右下)都能遍历到这个节点。
package newcoder;
import java.util.*;
public class Visit {
public static void main(String args[])
{
Visit obj=new Visit();
int map[][]=new int[][]{{0},{1},{2}};
System.out.println(obj.countPath(map, 0, 0));;
}
int resul=0;
int[][]record;
int si;
int sj;
boolean needres=false;
public int countPath(int[][] map, int n, int m) {
record=new int[map.length][map[0].length];
for(int i=0;i<map.length;i++)
{
for(int j=0;j<map[0].length;j++)
{
if(map[i][j]==1)
{
si=i;
sj=j;
dfs(map,i,j,true,true);
dfs(map,i,j,true,false);
dfs(map,i,j,false,true);
dfs(map,i,j,false,false);
return needres?resul/2:resul;
}
}
}
return 0;
}
public void dfs(int[][]map,int x,int y,boolean onlyLeft,boolean onlyTop)
{
if(x<0||x>=map.length||y<0||y>=map[0].length||record[x][y]==1)
{
return ;
}
if(map[x][y]==-1)
{
return ;
}
if(map[x][y]==2)
{
if(x==si||y==sj)
{
needres=true;
}
resul++;
return ;
}
record[x][y]=1;
if(onlyLeft)
{
dfs(map, x, y-1,onlyLeft,onlyTop);
}
else
{
dfs(map, x, y+1,onlyLeft,onlyTop);
}
if(onlyTop)
{
dfs(map, x-1, y,onlyLeft,onlyTop);
}
else
{
dfs(map, x+1, y,onlyLeft,onlyTop);
}
record[x][y]=0;
}
}