• 现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。给定一个地图map及它的长宽n和m,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。


    include "stdafx.h"

    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<iomanip>
    using namespace std;
    
    class Visit {
    public:
    	int countPath(vector<vector<int> > map, int n, int m) {
    		int count=0;
    		int compX, compY, sellerX,sellerY;
    		for (int i = 0;i < map.size();i++)
    		{
    			for (int j = 0;j < map[0].size();j++)
    			{
    				if (map[i][j] == 1)
    				{
    					compX = i; compY = j;
    				//	cout << "i:" << i << endl;
    				//	cout << "j:" << j << endl;
    				}
    				if (map[i][j] == 2)
    				{
    					sellerX = i, sellerY = j;
    				//	cout << "i:" << i << endl;
    				//	cout << "j:" << j << endl;
    				}
    			}
    		}
    		int minX = min(sellerX,compX);
    		int maxX = max(sellerX, compX);
    		int minY = min(sellerY, compY);
    		int maxY = max(sellerY, compY);
    		
    	
    		vector<vector<int> > mapp;
    		for (int i = minX;i <= maxX;i++)
    		{
    			vector<int> vec;
    			for (int j = minY;j <= maxY;j++)
    			{
    				vec.push_back(map[i][j]);
    			}
    			mapp.push_back(vec);
    		}
    		if (mapp[0][0] == 1)
    		{
    			return getPathLR(mapp);
    		}else if(mapp[mapp.size()-1][0] == 1)
    		{
    			return getPathHR(mapp);
    		}
    		else if (mapp[0][mapp[0].size()-1] == 1)
    		{
    			return getPathLL(mapp);
    		}
    		else
    		{
    			return getPathHL(mapp);
    		}
    
    		
    	}
    
    	int getPathLR(vector<vector<int> > map) {
    
    	//	if (map[0][0] != 1) return 0;
    
    		if (map.size() == 1)
    		{
    			int num = 0;
    			for (int i = 0;i < map[0].size();i++)
    			{
    				if (map[0][i] == -1)
    				{
    					num = 0;
    					break;
    				}
    				if (map[0][i] == 2)
    				{
    					num = 1;
    					break;
    				}
    			}
    			return num;
    		}
    		if (map[0].size() == 1)
    		{
    			int num = 0;
    			for (int i = 0;i < map.size();i++)
    			{
    				if (map[i][0] == -1)
    				{
    					num = 0;
    					break;
    				}
    				if (map[i][0] == 2)
    				{
    					num = 1;
    					break;
    				}
    			}
    			return num;
    		}
    		
    		return getPathLR(deleteRowLR( map) )+ getPathLR(deleteColLR(map));
    		
    	}
    
    	vector<vector<int> > deleteRowLR(vector<vector<int> > map)
    	{
    		map.erase(map.begin());
    		return map;
    	}
    	vector<vector<int> > deleteColLR(vector<vector<int> > map)
    	{
    		for (int i = 0;i < map.size();i++)
    		{
    			map[i].erase(map[i].begin());
    		}
    		return map;
    	}
    
    
    	int getPathHR(vector<vector<int> > map) {
    
    //		if (map[map.size()-1][0] != 1) return 0;
    
    		if (map.size() == 1)
    		{
    			int num = 0;
    			for (int i = 0;i < map[0].size();i++)
    			{
    				if (map[0][i] == -1)
    				{
    					num = 0;
    					break;
    				}
    				if (map[0][i] == 2)
    				{
    					num = 1;
    					break;
    				}
    			}
    			return num;
    		}
    		if (map[0].size() == 1)
    		{
    			int num = 0;
    			for (int i = map.size()-1;i >=0;i--)
    			{
    				if (map[i][0] == -1)
    				{
    					num = 0;
    					break;
    				}
    				if (map[i][0] == 2)
    				{
    					num = 1;
    					break;
    				}
    			}
    			return num;
    		}
    
    		return getPathHR(deleteRowHR(map)) + getPathHR(deleteColHR(map));
    
    	}
    
    	vector<vector<int> > deleteRowHR(vector<vector<int> > map)
    	{
    		map.erase(map.end()-1);
    		return map;
    	}
    	vector<vector<int> > deleteColHR(vector<vector<int> > map)
    	{
    		for (int i = 0;i < map.size();i++)
    		{
    			map[i].erase(map[i].begin());
    		}
    		return map;
    	}
    
    
    	int getPathLL(vector<vector<int> > map) {
    	//	if (map[0][map[0].size() - 1] != 1) return 0;
    		int count = 0;
    		if (map.size() == 1)
    		{
    			int num = 0;
    			for (int i = map[0].size()-1;i >=0;i--)
    			{
    				if (map[0][i] == -1)
    				{
    					num = 0;
    					break;
    				}
    				if (map[0][i] == 2)
    				{
    					num = 1;
    					break;
    				}
    			}
    			return num;
    		}
    
    		if (map[0].size() == 1)
    		{
    			int num = 0;
    			for (int i = 0;i < map.size();i++)
    			{
    				if (map[i][0] == -1)
    				{
    					num = 0;
    					break;
    				}
    				if (map[i][0] == 2)
    				{
    					num = 1;
    					break;
    				}
    			}
    			return num;
    		}
    
    		return getPathLL(deleteRowLL(map)) + getPathLL(deleteColLL(map));
    
    	}
    
    	vector<vector<int> > deleteRowLL(vector<vector<int> > map)
    	{
    		map.erase(map.begin());
    		return map;
    	}
    	vector<vector<int> > deleteColLL(vector<vector<int> > map)
    	{
    		for (int i = 0;i < map.size();i++)
    		{
    			map[i].erase((map[i].end()-1));
    		}
    		return map;
    	}
    
    	int getPathHL(vector<vector<int> > map) {
    
    	//	if (map[map.size()-1][map[0].size() - 1] != 1)  return 0;
    
    		if (map.size() == 1)
    		{
    			int num = 0;
    			for (int i = map[0].size()-1;i >=0;i--)
    			{
    				if (map[0][i] == -1)
    				{
    					num = 0;
    					break;
    				}
    				if (map[0][i] == 2)
    				{
    					num = 1;
    					break;
    				}
    			}
    			return num;
    		}
    		if (map[0].size() == 1)
    		{
    			int num = 0;
    			for (int i = map.size()-1;i >=0;i--)
    			{
    				if (map[i][0] == -1)
    				{
    					num = 0;
    					break;
    				}
    				if (map[i][0] == 2)
    				{
    					cout << "执行了" << endl;
    					num = 1;
    					break;
    				}
    			}
    			return num;
    		}
    
    		return getPathHL(deleteRowHL(map)) + getPathHL(deleteColHL(map));
    
    	}
    
    	vector<vector<int> > deleteRowHL(vector<vector<int> > map)
    	{
    		map.erase(map.end()-1);
    		return map;
    	}
    	vector<vector<int> > deleteColHL(vector<vector<int> > map)
    	{
    		for (int i = 0;i < map.size();i++)
    		{
    			map[i].erase((map[i].end() - 1));
    		}
    		return map;
    	}
    
    };
    int main()
    {
    	vector<vector<int> > map;
    	vector<int> vec1 = { 0,1,0 };
    	vector<int> vec2 = { 2,0,0 };
    	map.push_back(vec1);
    	map.push_back(vec2);
    	Visit v;
    	cout << v.countPath(map, 2, 3) << endl;;
    
    	return 0;
    }
  • 相关阅读:
    CentOS7.4安装和配置Zabbix4.0
    CentOS7.4安装jdk1.8.0_201、Tomcat-8.5.38环境
    基于腾讯云CentOS7.4+MySQL5.7+Python3+uWSGI+Nginx的Django项目部署
    Windows Server 2008 R2环境下Apache2.4+Tomcat8配置
    Django2.1.5使用xadmin打造适合国人的后台管理系统
    Django2.1.3 smtp 邮件 553报警
    GitHub的Windows客户端的使用教程
    Ubuntu18.04的网络配置(静态IP和动态IP)
    CentOS6.X、7.X下Jenkins的安装及使用
    CentOS7下搭建Nginx+PHP7的安装配置
  • 原文地址:https://www.cnblogs.com/wdan2016/p/6492784.html
Copyright © 2020-2023  润新知