洛谷P1135奇怪的电梯-题解
原题:

思路:
对于每一个楼层,只有上和下两种情况
将上和下分别入队跑BFS即可
代码:
#include<bits/stdc++.h>
using namespace std;
int n,a,b;
int move_count[205];
bool arrived_floor[205];
bool flag=true;
int nxt[2]={1,-1};
queue<int> queue_floor_number;
queue<int> queue_state_number;
void BFS()
{
while(!queue_floor_number.empty()&&!queue_state_number.empty())
{
int queue_floor_front=queue_floor_number.front();
int queue_state_front=queue_state_number.front();
queue_floor_number.pop();
queue_state_number.pop();
if(queue_floor_front==b)
{
printf("%d\n",queue_state_front);
flag=false;
return;
}
for(int i=0;i<2;i++)
{
int tf=queue_floor_front+(nxt[i]*move_count[queue_floor_front]);
if(!arrived_floor[tf]&&tf>=1&&tf<=n)
{
queue_floor_number.push(tf);
queue_state_number.push(queue_state_front+1);
arrived_floor[tf]=true;
}
}
}
}
int main()
{
scanf("%d %d %d",&n,&a,&b);
for(int i=1;i<=n;i++)
scanf("%d",&move_count[i]);
queue_floor_number.push(a);
queue_state_number.push(0);
BFS();
if(flag)
printf("-1\n");
return 0;
}
补充:
这道题可以考虑记忆化。
对于每个楼层,记忆它们到达目标点的最小步数。
浙公网安备 33010602011771号