拜访(美团)

2016/05/08 C和C++基础

题目描述

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

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

[[0,1,0],[2,0,0]],2,3

返回:2

程序代码

方法一:

#include <iostream>
#include <vector>

using namespace std;

void vistMap(vector<vector<int> > map,int startx,int starty,int endx,
		int endy,int vistlr,int vistud,int &s){
	if(startx==endx&&starty==endy){
		s++;
		return;
	}

	int n=map.size()-1;
	int m=map[0].size()-1;

	if((startx+vistlr>=0)&&(startx+vistlr<=m)){
		if(map[starty][startx+vistlr]!=-1)
			vistMap(map,startx+vistlr,starty,endx,
			endy,vistlr,vistud,s);
	}
	if((starty+vistud>=0)&&(starty+vistud<=n)){
		if(map[starty+vistud][startx]!=-1)
			vistMap(map,startx,starty+vistud,endx,
			endy,vistlr,vistud,s);
	}
}


int countPath(vector<vector<int> > map, int n, int m){
	int startx,starty,endx,endy;
	for(int i=0;i<map.size();i++){
		for(int j=0;j<map[i].size();j++){    //确定经理和商城的位置
			if(map[i][j]==1){
				startx=j;
				starty=i;
			}
			if(map[i][j]==2){
				endx=j;
				endy=i;
			}
		}
	}
	int vistlr;
	if(startx>endx)      //确定向左走还是向右走
		vistlr=-1;
	else if(startx<endx)
		vistlr=1;
	else
		vistlr=0;

	int vistud;
	if(starty>endy)     //确定向上走还是向下走
		vistud=-1;
	else if(starty<endy)
		vistud=1;
	else
		vistud=0;
	int s=0;
	vistMap(map,startx,starty,endx,endy,vistlr,vistud,s);  //递归遍历
	return s;
}

int main(){
	int a1[3]={1,0,0};
	int a2[3]={-1,0,2};
	vector<int> arr1(a1,a1+3);
	vector<int> arr2(a2,a2+3);
	vector<vector<int> > map;
	map.push_back(arr1);
	map.push_back(arr2);
	int n=2;
	int m=3;
	int s=countPath(map,n,m);
	cout<<s<<endl;

	system("pause");
}

方法二:

#include <iostream>
#include <vector>

using namespace std;

struct Point{
	int x;
	int y;
	bool lr;
	bool ud;
};

int countPath(vector<vector<int> > map, int n, int m){
	int startx,starty,endx,endy;
	for(int i=0;i<map.size();i++){
		for(int j=0;j<map[i].size();j++){    //确定经理和商城的位置
			if(map[i][j]==1){
				startx=j;
				starty=i;
			}
			if(map[i][j]==2){
				endx=j;
				endy=i;
			}
		}
	}
	int vistlr;
	if(startx>endx)      //确定向左走还是向右走
		vistlr=-1;
	else if(startx<endx)
		vistlr=1;
	else
		vistlr=0;

	int vistud;
	if(starty>endy)        //确定向上走还是向下走
		vistud=-1;
	else if(starty<endy)
		vistud=1;
	else
		vistud=0;

	int sum=0;
	vector<Point> path;
	Point startp;
	startp.x=startx;
	startp.y=starty;
	startp.lr=true;       //标志左右方向没有访问
	startp.ud=true;       //标志上下方向没有访问
	path.push_back(startp);

	while(!path.empty()){
		int s=path.size()-1;
		if(path[s].lr==true){                           //左右方向能访问
			path[s].lr=false;
			int xx=path[s].x+vistlr;
			if(xx==endx&&path[s].y==endy){              //是否到达终点
				sum++;
				path.pop_back();                        //出栈
			}else{
				if(xx>=0&&xx<=m-1){                     //判断是否越界
					if(map[path[s].y][xx]!=-1){         //判断是否等于-1
						Point pointemp;
						pointemp.x=xx;
						pointemp.y=path[s].y;
						pointemp.lr=true;
						pointemp.ud=true;
						path.push_back(pointemp);
					}	
				}
			}
			
		}else if(path[s].lr==false&&path[s].ud==true){   //上下方向能访问
			path[s].ud=false;
			int yy=path[s].y+vistud;
			if(yy==endy&&path[s].x==endx){               //到达终点
				sum++;
				path.pop_back();
			}else{
				if(yy>=0&&yy<=n-1){                      //判断是否越界
					if(map[yy][path[s].x]!=-1){          //判断是否等于-1
						Point pointemp;
						pointemp.x=path[s].x;
						pointemp.y=yy;
						pointemp.lr=true;
						pointemp.ud=true;
						path.push_back(pointemp);
					}
				}
			}
		}else{
			path.pop_back();                             //出栈
		}
	}
	return sum;
}

int main(){
	int a1[3]={1,0,-1};
	int a2[3]={0,0,0};
	int a3[3]={0,0,2};
	vector<int> arr1(a1,a1+3);
	vector<int> arr2(a2,a2+3);
	vector<int> arr3(a3,a3+3);
	vector<vector<int> > map;
	map.push_back(arr1);
	map.push_back(arr2);
	map.push_back(arr3);
	int n=3;
	int m=3;
	int s=countPath(map,n,m);
	cout<<s<<endl;

	system("pause");
}

Search

    Post Directory