题目链接:
问题分析:
根据问题描述,所处在的楼层,上或下的层数由给定数值确定。但是超出范围则不予响应。举个例子,如下表所示。
楼层号 | 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,测试过程中忘记考虑这个问题,从而导致有一个测试点没有过。