拜访

题目描述

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

你可能感兴趣的:(算法研究)