一开始被题目的篇幅吓到了,以为很难,后来仔细读题后发现就是一个简单的最短路,不过输入很麻烦,因为输入的问题WA了2次,后来换了种方法就过了 代码: #include<iostream> using namespace std; #define inf 999999 int g[500][500],dis[500],u[500]; void dijkstra(int source,int n) { int i,j,k,min; memset(u,0,sizeof(u)); for(i=1;i<=n;i++) dis[i]=inf; dis[source]=0; for(i=1;i<=n;i++) { min=inf; for(j=1;j<=n;j++) { if(!u[j]&&dis[j]<min) { min=dis[j]; k=j; } } u[k]=1; for(j=1;j<=n;j++) { if(g[k][j]!=0) { if(dis[j]>dis[k]+g[k][j]) dis[j]=dis[k]+g[k][j]; } } } } int main() { int i,j,k,n,block,v,h,a,b,w; char dir; while(scanf("%d%d",&v,&h)&&v&&h) { memset(g,0,sizeof(g)); for(n=1;n<=v;n++) { for(i=1;i<=h;i++) { scanf("%d %c",&w,&dir); if(w==0) continue; a=(n-1)*(h+1)+i; b=a+1; if(dir=='*') g[a][b]=g[b][a]=2520/w; else if(dir=='>') g[a][b]=2520/w; else g[b][a]=2520/w; } for(i=1;i<=h+1;i++) { scanf("%d %c",&w,&dir); if(w==0) continue; a=(n-1)*(h+1)+i; b=a+h+1; if(dir=='*') g[a][b]=g[b][a]=2520/w; else if(dir=='v') g[a][b]=2520/w; else g[b][a]=2520/w; } } for(i=1;i<=h;i++) { scanf("%d %c",&w,&dir); if(w==0) continue; a=v*(h+1)+i; b=a+1; if(dir=='*') g[a][b]=g[b][a]=2520/w; else if(dir=='>') g[a][b]=2520/w; else g[b][a]=2520/w; } n=(v+1)*(h+1); dijkstra(1,n); if(dis[n]==inf) printf("Holiday/n"); else printf("%d blips/n",dis[n]); } return 0; }