SDAU练习二1014
来源:互联网 发布:手机号码追踪软件 编辑:程序博客网 时间:2024/05/16 04:36
题目大意:
给出楼层总数,给出起始位置和终点位置。 然后现在 你在一个升降机里面,只能按 上升或者下降,给出 处在每层的时候 升降机运动的层数。也就是说,看样例:
现在处在 1 楼 ,要去 5楼。在 1 楼不可以按 下降,因为不可以降落到 -2 层。如果上升的话,会上升到 4 。也就是说上升或者下降越界的话,就不可以执行。
问 从起点到终点需要的最短次数。如果怎样都到不了没输出 -1
思路:
从 起点 bfs 就好了,还比较简单,只是上下两个状态。
感想:
这几个题豆豆教了我一晚上,想他请教了好多,,自己代码就是不过。,不知道为什么。。。。
AC代码:
#include<iostream>
#include<string.h>
#include<queue>
#include<stdio.h>
using namespace std;
int mapp[205];
int vis[205];
int n,st,endd;
struct lift
{
int x;
int num;
friend bool operator < (lift a,lift b)
{
return a.num>b.num;
}
};
int bfs()
{
priority_queue<lift>que;
lift star;
star.x=st;
star.num=0;
que.push(star);
lift now,now1;
while(!que.empty())
{
now=que.top();
que.pop();
vis[now.x]=1;
if(now.x==endd)
{
int t=now.num;
return t;
}
now1=now;
now.x=now.x+mapp[now.x];
now.num++;
if(now.x>0&&now.x<=n&&!vis[now.x])
que.push(now);
now1.num++;
now1.x=now1.x-mapp[now1.x];
if(now1.x>0&&now1.x<=n&&!vis[now1.x])
que.push(now1);
}
return 0;
}
int main()
{
int i,j;
while(~scanf("%d",&n))
{
if(n==0) break;
cin>>st>>endd;
for(i=1;i<=n;i++)
scanf("%d",&mapp[i]);
memset(vis,0,sizeof(vis));
int work=0;
if(st==endd)
{
cout<<0<<endl;
continue;
}
work=bfs();
if(work)
cout<<work<<endl;
else
cout<<-1<<endl;
}
return 0;
}
- SDAU练习二1014
- 2016SDAU编程练习二1014
- 2016sdau课程练习专题二 1014
- SDAU 练习二 10001
- SDAU 练习二 10002
- SDAU练习二 10017
- SDAU练习二 1008
- SDAU练习二1009
- SDAU练习二1013
- SDAU练习二1011
- SDAU练习二总结
- SDAU课程练习1014
- SDAU练习三 1014
- SDAU课程练习2 1014
- SDAU 课程练习3 1014
- 2016SDAU课程练习二1002
- 2016sdau课程练习专题二 1001
- 2016sdau课程练习专题二 1002
- virtual memory exhausted:cannot allocate memory
- android studio 中报Error:Execution failed for task ':app:mergeDebugResources'的解决方法
- 基于redis的分布式ID生成器
- C++之tinyXML使用
- 用两个栈实现队列
- SDAU练习二1014
- kali 被动信息收集
- TP框架-storage类分析
- BZOJ4517——[Sdoi2016]排列计数
- Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
- uvalive4727
- L1-3. 个位数统计
- POJ 2441 Arrange the Bulls
- 什么是DOM(个人理解)