解析:这道题目刚拿到手,很容易就确定是道优先搜索算法的题目,和我博客之前写的一道迷宫题目一致。根据题目,我们只要在输入的矩阵中找到最高点和最低点,然后从最高的地方开始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; }