最短路HDOJ1548
来源:互联网 发布:两个矩阵的卷积计算 编辑:程序博客网 时间:2024/05/07 10:24
题目大意:这个电梯只有两个按钮“上”和“下”,当你处在i层时,按“上”时,它会带你去i+ki层,按“下”,则会去i-ki层,然后你按下按钮以后的所到达的层数不能超出电梯层数范围(比如你处在第一层(电梯总共有5层,k1 = 3, k2 = 3,k3 = 1,k4 = 2, k5 = 5),当你按“上”,你就到达了第四层,但你不能按“下”)。问:当你在A层时,你想去B层,你至少需要按多少次“上”和“下”。
解题思路:此题可用搜索或最短路。以下是我用最短路写的算法。
此题只要转化为两点之间是否可达,再转化为用迪杰斯特拉算法求最短路径就行了。
代码如下:
#include <iostream>
#include<stdio.h>
#define inf 0x3fffffff
using namespace std;
int map[300][300];
int dis[300],vis[300];
int n;
int dijks(int s,int t)
{
int i,j,k;
for(i=1; i<=n; i++)//初始化
{
dis[i]=map[s][i];
vis[i]=0;
}
vis[s]=1;
dis[s]=0;
for(i=1; i<=n-1; i++)
{
int min=inf;
k=s;
for(j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]<min)
{
k=j;
min=dis[j];
}
}
vis[k]=1;
if(t==k||min==inf)
break;
for(j=1; j<=n; j++)
{
if(!vis[j]&&dis[k]+map[k][j]<dis[j])
{
dis[j]=map[k][j]+dis[k];
}
}
}
if(dis[t]==inf)
return -1;
else
return dis[t];
}
int main()
{
int a,b;
int i,j;
int floor[205];
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
scanf("%d%d",&a,&b);
for(i=1; i<=n; i++)
scanf("%d",&floor[i]);
if(a==b)//层数相等时
{
printf("0\n");
continue;
}
if(a>n||b>n)//超出范围时
{
printf("-1\n");
continue;
}
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
map[i][j]=map[j][i]=inf;
}
for(i=1; i<=n; i++)//看是否按下按钮后可行
{
if(i+floor[i]<=n)
map[i][i+floor[i]]=1;
if(i-floor[i]>0)
map[i][i-floor[i]]=1;
}
printf("%d\n",dijks(a,b));
}
return 0;
}
- 最短路HDOJ1548
- hdoj1548
- HDOJ1548(BFS)
- 最短路 & 次短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- Oracle参数文件详解
- 详解sqldeveloper连接常见错误
- UML类图——学设计模式前必备知识
- 前序遍历用一维数组表示的二叉树
- uva 11542 - Square(高斯异或)
- 最短路HDOJ1548
- poj3254压缩dp
- 通过javascript把图片转化为字符画
- SQLSERVER id in string
- mac杂文
- android中黑名单的实现
- 将文件隐藏到图片中
- C++友元函数
- C++漫步者问题模拟