HDU1548 A strange lift 广搜 + 最短路

来源:互联网 发布:python 文件写入变量 编辑:程序博客网 时间:2024/05/16 19:29

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548

题目大意:一个很奇怪的升降机,它有两个按钮UP和DOWN,给你一些数i表示层数,并且每层对应的Ki,如果按UP按钮,会从第i层升到第i+Ki层;如果按了DOWN则会从第i层降到第i-Ki层;并规定能到的层数为1到N,根据常识也知道。现在的要求就是给你N,A,B和一串数K1到Kn,问你从A到B,至少按几下按钮。


注意点:

1、为每走过的一层标记,以免出现每一层的Ki为0时,造成死循环;

2、如果A==B,直接输出0;

3、注意一开始是从1开始,而不是0,所以创建结构体数组时,要从0开始,否则判断队列为空时会出错。


代码:

#include <iostream>#include <cstdio>#include <queue>using namespace std;int n,st,se;int a[205];int vis[205];bool flag;struct Node {int x;int num;};void BFS(Node* node, int s, int e) {if(node == NULL || a[s] == 0 || a[s] >= n) {return;}queue<Node> Q;Q.push(node[s - 1]);while(!Q.empty()) {Node tmp = Q.front();Q.pop();if(tmp.x == e) {            flag = true;printf("%d\n", tmp.num);return;}Node tmp_1, tmp_2;tmp_1.x = tmp.x + a[tmp.x];if(tmp_1.x >= 1 && tmp_1.x <= n && !vis[tmp_1.x]) {            tmp_1.num = tmp.num + 1;Q.push(tmp_1);vis[tmp_1.x] = 1;}        tmp_2.x = tmp.x - a[tmp.x];if(tmp_2.x >= 1 && tmp_2.x <= n && !vis[tmp_2.x]) {            tmp_2.num = tmp.num + 1;Q.push(tmp_2);vis[tmp_2.x] = 1;}}}int main() {while(scanf("%d", &n), n) {        flag = false;scanf("%d%d",&st,&se);int i;Node* node = new Node[n];for(i = 1; i <= n; i++) {scanf("%d", &a[i]);node[i - 1].x = i;node[i - 1].num = 0;vis[i] = 0;}if(st == se) {            continue;}BFS(node, st, se);if(!flag) {            printf("-1\n");        }}}




0 0
原创粉丝点击