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