洛谷-奇怪的电梯(P1135)

题目链接:

奇怪的电梯

问题分析:

根据问题描述,所处在的楼层,上或下的层数由给定数值确定。但是超出范围则不予响应。举个例子,如下表所示。

楼层号123456
指定数值331251

观察例子发现,每一层到达的楼层是确定的,如果将楼层类比成顶点,相互间存在到达关系的表示有通路,因此可以将上述问题求解过程,转变为求顶点间的最短路径。

在这里插入图片描述

解法A:

借助弗洛伊德求解最短路径算法:

代码示例:
#include<iostream>
using namespace std;

int main(){
 	int MAX_SIZE = 100;
 	int INT = 1e7;
 	int lift[MAX_SIZE][MAX_SIZE];//存储数组初始化 
 	for(int i = 0; i < MAX_SIZE; i++)
  		for(int j = 0; j < MAX_SIZE; j++){
   			lift[i][j] = INT;
 	}
 	int n, a, b;
 	cin >> n >> a >> b; 
 	for(int i = 1; i <= n; i++){//电梯信息 
  		int x;
  		cin >> x;
  		if(i - x > 0)
   			lift[i][i-x] = 1;
  		if(i + x <= n)
   			lift[i][i+x] = 1;
 	}
 	for(int i = 1; i <= n; i++){
  		for(int j = 1; j <= n; j++){
   			for(int k = 1; k <= n; k++){
    				if(lift[i][k] + lift[j][i] < lift[j][k]){
     					lift[j][k] = lift[i][k] + lift[j][i];
    				}   
   			}
  		}
 	}
 	if(a == b) cout << 0;
 	else if(lift[a][b] == INT) cout << -1;
 	else cout << lift[a][b];
 	return 0;
}

如果自己到达自己则不需要按任何按键,即ans=0,测试过程中忘记考虑这个问题,从而导致有一个测试点没有过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值