洛谷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; }
补充:
这道题可以考虑记忆化。
对于每个楼层,记忆它们到达目标点的最小步数。