洛谷-奇怪的电梯(P1135)

博客皆个人学习过程中整理,如有问题,欢迎大家指正。
本文链接: https://blog.csdn.net/qq_42017331/article/details/102211371

题目链接:

奇怪的电梯

问题分析:

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

楼层号 1 2 3 4 5 6
指定数值 3 3 1 2 5 1

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

在这里插入图片描述

解法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,测试过程中忘记考虑这个问题,从而导致有一个测试点没有过。

猜你喜欢

转载自blog.csdn.net/qq_42017331/article/details/102211371