这道题其实是我练习dp的时候看到的,这道题应该归在dp里吗??(可能是我太菜了dp不会做吧。。。)我直接用dfs做了,还是比较容易的一道dfs题目。
思路:dfs每一步的坐标,三种情况 :1.向前一步 2.向后一步 3.如果有隧道,进入隧道。附上代码应该还是很好懂的。

#include<bits/stdc++.h>
using namespace std;
int mp[300];
int n,m;
int ans=INT_MAX;
bool vst[300];
void dfs(int x,int p)
{
   if(x==m)
    {
        ans=min(ans,p);
        return;
    }
    if(p>ans||x<0)   return;
    if(vst[x+1])
    {
        vst[x+1]=false;
        dfs(x+1,p+1);
        vst[x+1]=true;
    }
    if(x-1>=0&&vst[x-1])
    {
        vst[x-1]=false;
        dfs(x-1,p+1);
        vst[x-1]=true;
    }

    if(mp[x]!=-1&&vst[mp[x]])
    {

        vst[mp[x]]=false;
        dfs(mp[x],p+1);
        vst[mp[x]]=true;
    }

}
int main()
{
    cin>>m>>n;
    memset(mp,-1,sizeof(mp));
    memset(vst,true,sizeof(vst));
    for(int i=0;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        mp[x]=y;
    }
    vst[0]=false;
    dfs(0,0);
    cout<<ans;
    return 0;
}