题目描述
一天小松鼠想去到河的对面找他的朋友小熊玩。但是他没有办法直接游过去,只能选择游一小段,然后靠漂浮在水面上的木头跨过去。题目中会把过河的路线抽象成一条数轴,小松鼠开始在数轴零的位置上。每一次小松鼠可以选择向前游一格,或向后游一格。你有一格都算走了一步。如果他爬上了木头,穿过整个木头算一步。
现在题目中会给你一个整数 k,代表河对岸在数轴上的位置。然后题目会再给你一个整数 n 代表河面上漂流的木头的数量。下来 n 行每行会给两个整数,分别代表木头从河的 a 处一直到河的 b 处。现在请你编写代码,帮小松鼠计算,他最小需要几步可以游到河的对岸。
输入输出格式
输入格式第一行两个整数 k,n。接下来 n 行,每行 a,b 两个数。输出格式一个整数。
输入输出样例1
输入10 21 35 8
输出7
输入输出样例2
输入1 10 1
输出1
说明/提示
无
#include<iostream>
#include<math.h>
#include <string.h>
using namespace std; //命名空间
int main(){
int n,m; //n为木头数量,m为河对岸在数轴上的位置
cin>>m>>n;
int dis[234][234]; //定义二维数组
for(int i=0;i<=m;i++){
for(int j=1;j<=m;j++){
dis[i][j]=abs(i-j); //计算绝对值
}
}
for(int i=0;i<n;i++){ //走的木头的长度
int x,y;
cin>>x>>y;
dis[x][y]=1;
}
for(int i=m;i>=0;i--){
for(int j=0;j<=m;j++){
for(int k=0;k<=m;k++){
dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
}
}
}
cout<<dis[0][m];
}