题意:
一共有n层电梯,给你一个数组,p[i]表示第i层电梯能向上或向下移动p[i]层,问从a层移动至b层的最少次数,如果不能,就输出-1
思路:
题中明确了起点和终点,边权一样,要求最短路,很明显就是BFS
对于每一层,它有两个决策,是向上或者向下走p[i]层
然后我们确定边界条件,不能让它一直搜索下去
很显然,边界就是楼层必须要在1~n层
因此我们就可以进行BFS了
Code:
- #include
- using namespace std;
- const int mxn=2e2+10;
- int n,a,b;
- int p[mxn],dis[mxn];
- queue<int> q;
- bool check(int x){
- return x>=1&&x<=n;
- }
- void change(int u,int v){
- if(dis[v]==0x3f3f3f3f&&check(v)){
- dis[v]=dis[u]+1;
- q.push(v);
- }
- }
- void bfs(int u){
- memset(dis,0x3f,sizeof(dis));
- dis[u]=0;
- q.push(u);
- while(!q.empty()){
- int tmp=q.front();
- q.pop();
- change(tmp,tmp+p[tmp]);
- change(tmp,tmp-p[tmp]);
- }
- }
- void init(){
- while(!q.empty()) q.pop();
- }
- int main(){
- while(scanf("%d%d%d",&n,&a,&b)==3){
- init();
- for(int i=1;i<=n;i++) scanf("%d",&p[i]);
- bfs(a);
- if(dis[b]==0x3f3f3f3f) puts("-1");
- else printf("%d\n",dis[b]);
- }
- return 0;
- }
总结:
算法:
什么时候使用BFS最短路:确定了起点和终点,求最少操作次数
写法:
可以用一个结构体直接表示状态图
或者只用dis数组维护深度
边界条件用check函数