HDU 1548 A strange lift
2015-08-11 16:53
363 查看
原题链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1548题目大意:
输入N,A,B。分别表示有N层楼,最初楼层为A。终点楼层为B。然后是N个数表示在第i层楼按上或者下可以移动多少层。楼层不能超过N也不能低于1.例如:
5 1 5
3 3 1 2 5
表示有5层楼,起点为1.终点为5。在3楼时。按下按钮可以上1层楼,或者下1层楼。
思路:
采用一般的bfs的方法既可以解得一个数组存放访问标记是否到过这层楼。
一个数组存放到达这层楼的前一层楼是哪一层
越界判定和输出判定
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; int N,A,B; int Floor[205]; int Check[205]; int Pre[205]; int number; int Up_Down[2]={ 1, -1 }; bool Can; bool bIsLeagal(int Next ) { if( Next < 1 || Next > N ) return false; return true; } void GetCount(int Index) { while( Pre[ Index ] != -1 ) { Index = Pre[ Index ]; number++; } } void bfs() { queue<int> check_floor; memset( Check,0,sizeof(Check)); memset( Pre,0,sizeof( Pre )); Pre[A] = -1; Check[A] = true; check_floor.push ( A ); int Now,Next; while( !check_floor.empty ()) { Now = check_floor.front (); check_floor.pop (); if( Now == B ) { Can = true; GetCount( Now ); return; } int i; for( i = 0; i < 2; i++ ) { Next = Now + Floor[Now] * Up_Down[i]; if( bIsLeagal( Next ) && !Check[Next] ) { Pre[Next] = Now; Check[Next] = true; check_floor.push ( Next ); } } } } int main() { while( cin >> N ) { if( N == 0 ) break; cin >> A >> B; Can = false; number = 0; memset( Floor,0,sizeof( Floor)); int i; for( i = 1; i <= N; i++ ) cin>> Floor[i]; bfs(); if( Can ) cout<< number <<endl; else cout<<-1<<endl; } return 0; }
相关文章推荐
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- 本人即将筹备败家日志,敬请期待!
- IE:使用搜索助手
- C++深度优先搜索的实现方法
- 基于文本的搜索
- php实现搜索一维数组元素并删除二维数组对应元素的方法
- 使用Sphinx对索引进行搜索
- asp 多关键词搜索的简单实现方法
- C#使用foreach语句搜索数组元素的方法
- JavaScript中数组的排序、乱序和搜索实现代码
- C#编程实现Excel文档中搜索文本内容的方法及思路
- sqlserver中在指定数据库的所有表的所有列中搜索给定的值
- 可以用来搜索当前页面内容的js代码
- 全文搜索和替换
- javascript搜索自动提示功能的实现第1/3页
- mysql 模糊搜索的方法介绍
- 基于ASP.NET的lucene.net全文搜索实现步骤
- 做个自己站内搜索引擎
- PHP查找与搜索数组元素方法总结
- C语言按关键字搜索文件夹中文件的方法