洛谷 P1135 奇怪的电梯
作者:互联网
题目链接 https://www.luogu.com.cn/problem/P1135
这题可以用bfs和dfs两种方法,这里先说一下bfs。
在本题中,相邻状态为当前所在楼层通过按向上或向下按钮所能到达的楼层,每个状态要记录的信息包括楼层编号和按按钮的次数。
先判断是否到达终点,是则返回x.step(到达此楼层一共需要按钮的次数),再判断下一个到达的楼层是否越界或是否已经被标记过。
放AC代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,a,b,ans=0; 4 int k[210]; 5 int vis[210];//标记数组 6 struct node 7 { 8 int id;//表示楼层号 9 int step;//表示按钮次数 10 }x; 11 int bfs(int a) 12 { 13 vis[a]=1; 14 queue<node>q; 15 q.push((node){a,0});//起始点入队 16 while(!q.empty()) 17 { 18 x=q.front(); 19 q.pop(); 20 if(x.id==b) return x.step; 21 if(x.id+k[x.id]<=n&&!vis[x.id+k[x.id]]) 22 { 23 q.push((node){x.id+k[x.id],x.step+1}); 24 vis[x.id+k[x.id]]=1; 25 } 26 if(x.id-k[x.id]>=1&&!vis[x.id-k[x.id]]) 27 { 28 q.push((node){x.id-k[x.id],x.step+1}); 29 vis[x.id-k[x.id]]=1; 30 }a 31 } 32 return -1; 33 } 34 int main() 35 { 36 ios::sync_with_stdio(false); 37 cin>>n>>a>>b; 38 for(int i=1;i<=n;i++) 39 cin>>k[i]; 40 cout<<bfs(a); 41 return 0; 42 }
标签:洛谷,int,step,vis,电梯,楼层,按钮,id,P1135 来源: https://www.cnblogs.com/marswithme/p/16075043.html