专题二 Problem1014

题目大意:

有这样一部电梯,它只有上升键和下降键,上升时会上到(i+k[i])层,下降时会下到(i-k[i])层(i:楼层数,k[i]:上升的楼层数),输入起点和终点,问:至少要按几次上升或下降键才能到达指定楼层。

解题思路:

此题采用广度搜索算法BFS。用一个二维数组flor[][2]来存储上升或下降可到的楼层数,flor[][0]表示上升可到的楼层,flor[][1]表示下降可到的楼层,分上下两个方向搜索,判断若此时位置已到终点则退出搜索。广度搜索用队列,将初始状态放入队列,然后向上向下搜索状态,删除原状态,满足条件的放入队列,以此类推,直到队列为空。

感想:

就我个人而言,我觉得BFSDFS更容易理解,DFS用到递归我就很蒙了,搞不明白程序的具体执行情况,而BFS则让人很容易看懂里面的具体的执行情况。以下代码是我自己写的,而在oj上提交的代码是我从百度上找的,我就很纳闷这俩代码差不多为什么我的这个内存就超过限制了。

代码如下:

#include<iostream>

#include<cstdio>

#include<queue>

#include<cstring>

using namespace std;

#define MaxSize 200

int start, high, n;//起点、终点、楼层最高数

int flor[MaxSize][2];

struct Elevator

{

int pos;

int time;

};

queue<Elevator>Q;

int BFS()

{

Elevator temp,trans,q;

temp.pos = start;

temp.time = 0;

if (start<1||start>MaxSize||high<1||high>MaxSize)

return -1;

Q.push(temp);

while (!Q.empty())

{

trans = Q.front();

if (trans.pos == high)

return trans.time;

Q.pop();

int up = flor[trans.pos][0];

int down = flor[trans.pos][1];

if (up !=-1)

{

q.pos = up;

q.time = trans.time + 1;

Q.push(q);

}

if (down!=-1)

{

q.pos = down;

q.time = trans.time + 1;

Q.push(q);

}

}

return -1;

}

int main()

{

while (cin >> n)

{

while (!Q.empty())

Q.pop();

memset(flor, -1, sizeof(flor));

cin >> start >> high;

for (int i = 1; i <= n; i++)

{

int t;

cin >>t;

if (i + t <= n)

flor[i][0] = i + t;

if (i - t >= 1)

flor[i][1] = i - t;

}

cout << BFS() << endl;

}

system("pause");

return 0;

}

你可能感兴趣的:(专题二 Problem1014)