HDU 1548 A strange lift(Dijkstra,简单BFS)
题目大意:
电梯有两个选项向上或向下,每层楼有一个参数ki,代表电梯可以再该楼层的基础上向上或向下移动ki层,限制条件是向上不能超过楼层总数n,向下不能少于一。输入总层数n和当前所在层数以及目标层数,然后是n个数分别代表第i层的移动范围。输出最少移动次数,若不可达,输出-1.
解题思路:
1.用Dijkstra算法,首先构建邻接矩阵,注意在构造时,要考虑i-k[i]<1和i+k[i]>n,i代表当前所在层。
#include<string.h>
#include<stdio.h>
#define INF 0x3f3f3f3f
int k[];
int g[][];
int dis[],vis[];
int t,s,d,x,y;
int a,b,n;
void dijkstra(int start)
{
int i,j,k;
memset(vis,,sizeof(vis));//初始化vis数组,标记为都未访问过。
for(i=; i<=n; i++)
{
if(i==start)
dis[i]=;
else
dis[i]=INF;
}//除起始点外,其他点的dis都赋为正无穷
for(i=; i<=n; i++)
{
int r;
int min=INF;
for(j=; j<=n; j++)
if(!vis[j]&&dis[j]<min)
{
min=dis[j];
r=j;
}找出当前未被访问的点中权值最小的点,对所有从该点出发的边进行松弛。
vis[r]=;
for(k=; k<=n; k++)//松弛操作
if(dis[k]<(dis[r]+g[r][k]))
dis[k]=dis[k];
else
dis[k]=dis[r]+g[r][k];
}
return;
}
int main()
{
int i;
while(scanf("%d",&n)!=EOF&&n)
{
memset(g,INF,sizeof(g));
scanf("%d%d",&a,&b);
for(i=; i<=n; i++)
{
scanf("%d",&k[i]);
}
for(i=; i<=n; i++)
{
if(i-k[i]<)
g[i][k[i]+i]=;
if(i+k[i]>n)
g[i][i-k[i]]=;
if(i-k[i]>=&&i+k[i]<=n)
{
g[i][k[i]+i]=;
g[i][i-k[i]]=;
}
}
dijkstra(a);
if(dis[b]==INF)
printf("-1\n");
else
printf("%d\n",dis[b]);
}
return ;
}
2.BFS算法:
有向上走和向下走两种方法:
#include <iostream>
#include <stdio.h>
#include <queue>
using namespace std;
int n, start,end;
int a[];
bool vis[], flag;
struct node
{
int x, step;//x记录当前所在层,step记录已经走了几次
} n1, n2, m;
int main()
{
int i;
while(scanf("%d", &n)!=EOF)
{
if(n== )
break;
scanf("%d %d", &start,&end);
for(i = ; i <= n; i++)
{
scanf("%d", &a[i]);
vis[i] = false;
}
flag = false;
n1.x = start;
n1.step = ;
queue<node> Q;
Q.push(n1);//起始点入队列
vis[n1.x] = true;
while(!Q.empty())
{
m = Q.front();
Q.pop();
if(m.x == end)
{
flag = true;
break;
}
n1.x = m.x - a[m.x];
n2.x = m.x + a[m.x];
if(n1.x> && n1.x<=end && !vis[n1.x])
{
n1.step = m.step + ;
vis[n1.x] = true;
Q.push(n1);
}
if(n2.x> && n2.x<=end && !vis[n2.x])
{
n2.step = m.step + ;
vis[n2.x] = true;
Q.push(n2);
}
}
if(flag)
printf("%d\n", m.step);
else
printf("-1\n");
}
return ;
}
HDU 1548 A strange lift(Dijkstra,简单BFS)的更多相关文章
- hdu 1548 A strange lift 宽搜bfs+优先队列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 There is a strange lift.The lift can stop can at ...
- HDU 1548 A strange lift (Dijkstra)
A strange lift http://acm.hdu.edu.cn/showproblem.php?pid=1548 Problem Description There is a strange ...
- HDU 1548 A strange lift(最短路&&bfs)
A strange lift Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- hdu 1548 A strange lift (dijkstra算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 题目大意:升降电梯,先给出n层楼,然后给出起始的位置,即使输出从A楼道B楼的最短时间. 注意的几 ...
- hdu 1548 A strange lift
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1548 A strange lift Description There is a strange li ...
- HDU 1548 A strange lift (bfs / 最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 A strange lift Time Limit: 2000/1000 MS (Java/Ot ...
- HDU 1548 A strange lift (最短路/Dijkstra)
题目链接: 传送门 A strange lift Time Limit: 1000MS Memory Limit: 32768 K Description There is a strange ...
- hdu 1548 A strange lift (bfs)
A strange lift Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- HDU 1548 A strange lift(BFS)
Problem Description There is a strange lift.The lift can stop can at every floor as you want, and th ...
随机推荐
- 摘抄python __init__
注意1.__init__并不相当于C#中的构造函数,执行它的时候,实例已构造出来了. 1 2 3 4 5 class A(object): def __init__(self,name): ...
- 使用VirtualBox SDK之初步编译
VirtualBox成功编译出来后,在生成的out文件夹中会发现有SDK文件夹(当然也可以直接从官网下SDK),里面有例子,但是直接用Visual Studio编译的话会出一大堆错误,本文就是讲解如何 ...
- C++静态库中使用_declspec(dllexport) 不能导出函数的问题
在某项目中,有一些静态库,这些静态库中有类型命名的函数GET_XXX.在一次项目结构调整的时候,我想将调用这静态库的代码编译成DLL,并且将这些Get函数导出,我就直接就这些函数前面添加了_decls ...
- 使用ExifInterface获取图片信息
package com.example.readimage; import java.io.IOException; import android.media.ExifInterface; impor ...
- Join的实现步骤 以及连接的概念
Join的实现步骤 以及连接的概念 我们常说连接有三种,即 交叉连接.内连接.外连接,这三者的概念很容易模糊,现在我们先放下概念,搞清楚完整连接实现的步骤: 一个完整的连接有三个步骤:.做笛卡儿积: ...
- jQuery 3.0 的 Data
jQuery 3.0 的 Data Snandy If you cannot hear the sound of the genuine in you, you will all of your li ...
- maven setting配置
<?xml version="1.0" encoding="UTF-8"?> <!--Licensed to the Apache Softw ...
- 免解压版的Mysql的启动脚本,并且执行导入(windows)
@echo off rem ################### set MYSQL_VERSION=mysql-5.5.32-win32 set LOCK=wot.lock rem ####### ...
- linux学习之四---gdb调试
在Linux应用程序开发中,最经常使用的调试器是gdb. 一.启动和退出gdb gdb调试的对象是可运行文件,而不是程序的源码.假设要使一个可运行文件能够被gdb调试,那么使用编译器gcc编译时须要增 ...
- uva 10127 - Ones(数论)
题目链接:uva 10127 - Ones 题目大意:给出n,问说者少要多少为1才干够整除n. 解题思路:等于是高精度取模,直到余数为0为止. #include <cstdio> #inc ...