一道比较经典的迷宫问题

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

给定一个地图map及它的长宽nm,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。

测试样例:
[[0,1,0],[2,0,0]],2,3
返回:2
#include <iostream>

using namesapce std;

//注意visit矩阵,它的作用是防止回溯到上一个访问的节点,比如我们从1 1开始向右走,这时候1 1 位置被置1了,向右走后,到达1 2,这时候有四个可能,向右向下向左向上,但是这里的向左,就没必要了,因为他就是从左边过来的,所以为了实现这一步,要用   if(visit[x][y]==1)  return 0;来判断。当然,visit不仅有全部变量这种形式,也可以用传参方式来进行。

int visit[10010][10010];

    int pm_x,pm_y;
    void findPM(vector <vector <int>>map,int n,int m,int *x,int *y)
    {
       int i,j;
       for(i=0;i<n;i++)
       {
           
         for(j=0;j<n;j++)
         {
             if(map[i][j]==1)
             {
                 *x=i;
                 *y=j;
             }
         }
       }
    }
    int fun(vector <vector <int>>map,int n,int m,int x,int y)
    {
        int i,j;
        int ret=0;
        int left,right,up,down;
        if(x<0||y<0||x>=n||y>=m)
            return 0;
        if(map[x][y]==-1)
            return 0;
        if(map[x][y]==2)
            return 1;
        if(visit[x][y]==1)
            return 0;
        visit[x][y]=1;
        right=fun(map,n,m,x,y+1);
down=fun(map,n,m,x+1,y);
left=fun(map,n,m,x,y-1);
up=fun(map,n,m,x-1,y);
ret+=left+right+up+down;
cout<<"x is"<<x<<" y is"<<y<<" "<<left<<" "<<right<<" "<<up<<" "<<down<<endl;

        visit[x][y]=0;
        return ret;
        
            
            
            
    }
    int countPath(vector<vector<int> > map, int n, int m) {
        // write code here
        memset(visit,0,sizeof(visit));
        findPM(map,n,m,&pm_x,&pm_y);
        return fun(map,n,m,pm_x,pm_y);
    }
int main()
{
vector <vector <int>> map;
map.resize(3);
map[0].push_back(0);
map[0].push_back(0);
map[0].push_back(2);
map[0].push_back(0);
map[1].push_back(-1);
map[1].push_back(-1);
map[1].push_back(0);
map[1].push_back(0);
map[2].push_back(0);
map[2].push_back(0);
map[2].push_back(1);
map[2].push_back(0);
cout<<countPath(map,3,4)<<endl;
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值