http://acm.hdu.edu.cn/showproblem.php?pid=1548
题意:一个特别的电梯,按up可升上k[i]层,到大i+k[i]层,down则到达i-k[i]层,最高不能超过n,最低不能小于1,给你一个起点和终点,问最少可以按几次到达目的地。
分析:把n转换为一个n*n初始化为0的数组,后对每一层可到达的楼层加上一条边为1,
这样就转换为求两点之间的最短路问题。
感想:建图是关键,脑子里面要有图的思想就好办了,一开始也不敢敲,但是笔画了几下,图就出来了,自信心大增啊。这题能用最短路径做真是神奇,网上有用搜索做的可以借鉴一下。
话说:这题wa了一次,在else if 那边。该死。应该改为if..原因还用说吗?

// I'm lanjiangzhou //C #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <math.h> #include <time.h> //C++ #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <cctype> #include <stack> #include <string> #include <list> #include <queue> #include <map> #include <vector> #include <deque> #include <set> using namespace std; //*************************OUTPUT************************* #ifdef WIN32 #define INT64 "%I64d" #define UINT64 "%I64u" #else #define INT64 "%lld" #define UINT64 "%llu" #endif //**************************CONSTANT*********************** #define INF 0x3f3f3f3f // aply for the memory of the stack //#pragma comment (linker, "/STACK:1024000000,1024000000") //end const int maxn = 1010; int edge[maxn][maxn]; int dis[maxn]; int a[maxn]; int n,start,end; int S[maxn]; int sum=0; void dijkstra(int v0){ for(int i=1;i<=n;i++){ dis[i]=edge[v0][i]; S[i]=0; } S[v0]=1; dis[v0]=0; for(int i=1;i<=n-1;i++){ int min=INF, u=v0; for(int j=1;j<=n;j++){ if(!S[j]&&dis[j]<min){ u=j; min=dis[j]; } } S[u]=1; for(int k=1;k<=n;k++){ if(!S[k]&&edge[u][k]<INF&&dis[u]+edge[u][k]<dis[k]){ dis[k]=dis[u]+edge[u][k]; //printf("dis[k]=%d\n",dis[k]); //sum++; } } } } int main(){ while(scanf("%d",&n)!=EOF){ if(n==0) break; scanf("%d%d",&start,&end); //start--; //end--; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ edge[i][j]=INF; } } for(int i=1;i<=n;i++){ scanf("%d",&a[i]); if((i+a[i])<=n) edge[i][i+a[i]]=1; if((i-a[i])>=1) edge[i][i-a[i]]=1;//不小心这里写出else if。活该wa..... } // for(int i=0;i<n;i++){ // for(int j=0;j<n;j++){ // if(a[i]+edge[i][a[i]]<=end){ // edge[i][i+a[i]]=1; // } // else if(a[i]-edge[i][a[i]]>=start){ // edge[i][i-a[i]]=-1; // } // else edge[i][j]=INF; // } // } dijkstra(start); if(dis[end]==INF ) printf("-1\n"); else printf("%d\n",dis[end]); } return 0; }
网上有用搜索做的可以看看。一题多解多好。http://gzhu-101majia.iteye.com/blog/1138574话说又是这位大神。