题目大意:
有这样一部电梯,它只有上升键和下降键,上升时会上到(i+k[i])层,下降时会下到(i-k[i])层(i:楼层数,k[i]:上升的楼层数),输入起点和终点,问:至少要按几次上升或下降键才能到达指定楼层。
解题思路:
此题采用广度搜索算法BFS。用一个二维数组flor[][2]来存储上升或下降可到的楼层数,flor[][0]表示上升可到的楼层,flor[][1]表示下降可到的楼层,分上下两个方向搜索,判断若此时位置已到终点则退出搜索。广度搜索用队列,将初始状态放入队列,然后向上向下搜索状态,删除原状态,满足条件的放入队列,以此类推,直到队列为空。
感想:
就我个人而言,我觉得BFS比DFS更容易理解,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;
}