【算法】最長路徑——百度2017校招機試題

解析:這道題目剛拿到手,很容易就確定是道優先搜索算法的題目,和我博客之前寫的一道迷宮題目一致。根據題目,我們只要在輸入的矩陣中找到最高點和最低點,然後從最高的地方開始4個方向的輪訓,直到最後到達最低點。那既然是要求最長的奔跑路徑,那麼每次4個方向輪訓肯定是要走當中值最大的那一個了。

 

#include <iostream>
#include <stack>
using namespace std;

typedef struct _Point  
{  
	int x;  
	int y;  
	_Point()  
	{  
		x = 0;  
		y = 0;  
	};  
	_Point(const int& v_nx, const int& v_ny)  
	{  
		x = v_nx;  
		y = v_ny;  
	};  
	bool operator==(const _Point& v_p)  
	{  
		if(x == v_p.x && y == v_p.y)  
		{  
			return true;  
		}  
		return false;  
	}  
}POINT, *PPOINT;  

int main()
{
	int X, Y = 0;
	int MyMap[100][100] = {0};
	int dir[4][2] = {{0, 1},{1, 0},{0, -1},{-1, 0}};
	int xMax, yMax = 0;
	int xMin, yMin = 0;
	int nMax = MyMap[0][0];
	int nMin = -1;
	while(cin >> X >> Y)
	{
		for(int i = 0; i < X; ++i)
		{
			for(int j = 0; j < Y; ++j)
			{
				cin >> MyMap[i][j];
				if(MyMap[i][j] > nMax)				//!<記錄最高的位置
				{
					nMax = MyMap[i][j];
					xMax = i;
					yMax = j;
				}
				
				if(MyMap[i][j] < nMin || nMin == -1) //!<記錄最低的位置
				{
					nMin = MyMap[i][j];
					xMin = i;
					yMin = j;
				}
			}
		}

		int MyVisit[100][100] = {0};
		int nLength = 0;
		bool bEnd = false;
		POINT pointStart;
		pointStart.x = xMax;
		pointStart.y = yMax;

		POINT pointEnd;
		pointEnd.x = xMin;
		pointEnd.y = yMin;

		stack<POINT> Queue;
		Queue.push(pointStart);
		MyVisit[pointStart.x][pointStart.y] = 1;
		nLength++;
		while(!Queue.empty())
		{
			POINT pointCur = Queue.top();
			if(pointCur == pointEnd)
			{
				break;
			}
		
			POINT pointNext;
			int nGaoDu = 0;
			for(int i = 0; i < 4; ++i)
			{
				POINT pointTemp(pointCur.x + dir[i][0], pointCur.y + dir[i][1]);
				if(pointTemp.x >= 0 && pointTemp.y >= 0 &&  //!<判斷是否越界
					pointTemp.x < X && pointTemp.y < Y)  
				{  
					if(MyVisit[pointTemp.x][pointTemp.y] == 0)//判斷節點是否訪問過  
					{  
						if(MyMap[pointTemp.x][pointTemp.y] > nGaoDu)
						{
							pointNext.x = pointTemp.x;
							pointNext.y = pointTemp.y;
							nGaoDu = MyMap[pointTemp.x][pointTemp.y];
						} 
					}  
				} 
			}
			Queue.pop();
			Queue.push(pointNext);
			MyVisit[pointNext.x][pointNext.y] = 1;
			nLength++;

		}

		cout << nLength << endl;

	}
	return 0;
}

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章