题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548
这个题目很容易让人用广搜。。。无语。。。
#include<iostream> #include<string> #include<cstdio> #include<cstring> #include<map> #include<queue> #include<cmath> #include<stack> #include<set> #include<vector> #include<algorithm> #define LL long long #define inf 1<<29 #define s(a) scanf("%d",&a) #define CL(a,b) memset(a,b,sizeof(a)) using namespace std; const int N=205; int n,m,a,b; int Map[N][N]; // 用于记录图的方向; int dist[N]; // 用于记录从1到k点的路程; bool vis[N]; // 用于标记是否走过这条路 void dijkstra() { CL(vis,false); for(int i=1;i<=n;i++) dist[i]=inf; dist[a]=0; // 这里需要注意一下,不可以写成是dist[1];因为起始点不一定在1位置; while(1){ int v=-1; for(int u=1;u<=n;u++) // 选取最短路径; if(!vis[u]&&(v==-1||dist[u]<dist[v])) v=u; if(v==-1) break; // 没有最短路了,返回; vis[v]=true; for(int u=1;u<=n;u++) // 更新最短路径; dist[u]=min(dist[u],dist[v]+Map[v][u]); } } int main() { int t; while(~s(n)){ if(!n) break; scanf("%d%d",&a,&b); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) Map[i][j]=inf; Map[i][i]=0; } for(int i=1;i<=n;i++){ s(t); if(i+t<=n) Map[i][i+t]=1; // 巧妙的将上下楼梯转换成到达的目的地; if(i-t>=1) Map[i][i-t]=1; } dijkstra(); if(dist[b]<inf) printf("%d\n",dist[b]); else printf("-1\n"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-12-29 07:22:00