BFS 搜索 Problem 1013 A strange lift
2016-04-14 17:05
387 查看
Problem ID:1013 A strange lift
简单题意:在一个特殊的电梯中,如果你当前在第i层,按up则向上走ki层,按down则向下走ki层。如果将要到达的楼层<1或者>n,则按up或down将没有作用。给出总楼层数n,起始楼层a和目的楼层b,以及k1 k2 k3 ……kn, 求到达楼层b所需要的最少操作次数。如果不能到达则输出“-1”。
解题思路形成过程:因为是求“最少”次数,所以要使用BFS,将符合要求的下个目的楼层数以及对应的操作次数放入队列queue中,当下个目的楼层为最终目的楼层时,结束循环,输出结果;否则一直循环到queue中所有的元素都遍历结束。
下个目的楼层的要求共有3个:①:楼层数不能小于1;
②:楼层数不能大于n;
③:此楼层在之前没有到达过(否则就不是最少操作次数了);
感想:一定注意、记牢:求所有的可能情况使用DFS,求最少、最快的情况使用BFS。
熟悉、掌握DFS和BFS的区别以及具体用法。
一开始用了DFS,导致虽然结果正确,但放到OJ上后TLE了。
还要注意输出格式,此题输出时最后不要漏加回车,否则会导致PE。
代码:
#include<iostream> #include<cmath> #include<stdio.h> #include<string.h> #include<queue> using namespace std; int n,a,b; int s[201],cmap[201]; int dfs() { int down,up; //down,up:到达的楼层 int cnt=0; queue <int> q; q.push(a); q.push(cnt); cmap[a-1]=1; while(!q.empty()) { int t1=q.front(); q.pop(); int t2=q.front(); q.pop(); if(t1==b) return t2; down=t1-s[t1-1]; up=t1+s[t1-1]; if(down>=1&&cmap[down-1]==0){ cmap[down-1]=1; q.push(down); q.push(t2+1); } if(up<=n&&cmap[up-1]==0){ cmap[up-1]=1; q.push(up); q.push(t2+1); } } return -1; } int main() { //freopen("2.txt","r",stdin); while(scanf("%d",&n)) { if(n==0) return 0; memset(cmap,0,sizeof(cmap)); scanf("%d %d",&a,&b); for(int i=0;i<n;++i) scanf("%d",&s[i]); int t; t=dfs(); printf("%d\n",t); } }
相关文章推荐
- 利用栈ADT写了一个简单的四则混合运算
- Cocos2dx:cocostudio 2.0 Text文本控件
- C++笔记2
- php框架+phpcms
- 刻录光盘(图论基础)
- TCP/IP详解学习笔记(5)-IP选路,动态选路,和一些细节
- TCP/IP详解学习笔记(6)-UDP协议
- android 获取手机通讯录联系人,模拟通讯录显示
- 简单数的乘法结果
- 10得阶乘
- WCF DataGrid列的自动换行
- chmod修改文件的权限/chown修改文件和目录的所有者
- application , application pool., W3wp ,httpapplication, domain
- nginx网站开启https访问,http自动跳转到https
- 67.LeetCode Add Binary(easy)[字符串 大数相加处理]
- pre浏览器不折行问题解决
- sun.net.ftp.FtpClient 删除文件夹删除文件
- Git客户端图文详解如何安装配置GitHub操作流程攻略
- ajax技术
- [MySQL]快速解决"is marked as crashed and should be repaired"故障