处理完输入就是很简单的一题 但是输入好难
勉强找到一种能看懂的。。。
#include<iostream> #include<stdio.h> #include<string> #include<cstring> using namespace std; #define MAX 999999999 #define N 501 int vis[N],map[N][N],dis[N]; int n,m; int Dijkstra(int start,int end) { int i,j,min,loc; memset(vis,0,sizeof(vis)); for(i=1;i<=end;i++) dis[i]=map[start][i]; dis[start]=0; for(i=1;i<=end;i++) { min=MAX; for(j=1;j<=end;j++) { if(!vis[j]&&dis[j]<min) { min=dis[j]; loc=j; } } vis[loc]=1; for(j=1;j<=end;j++) { if(!vis[j]&&dis[loc]+map[loc][j]<dis[j]) dis[j]=dis[loc]+map[loc][j]; } } return dis[end]; } int main() { int i,j,ver,hor,d,x,y,d1,d2,ans; char ch; //freopen("test.txt","r",stdin); while(scanf("%d%d",&n,&m),n+m) { for(i=1;i<=(n+1)*(m+1);i++)//共有(n+1)*(m+1)点 for(j=1;j<=(n+1)*(m+1);j++) map[i][j]=MAX; ver=1;hor=1; //若图中2*2的 则是3*3,节点是1-9,map[1][4]代表第一行指第二行的6 for(i=1;i<=2*n+1;i++) { for(j=1;j<=m+!(i&1);j++)//偶数多一个输入 { scanf("%d %c",&d,&ch); if(d==0)// 如果d为0,表示此路不通 ch=0; if(i&1)//奇数 横向的路 { x=j+(m+1)*(hor-1); y=x+1;//横向的始终是[x][x+1] d1=(ch=='*'||ch=='>')?2520/d:MAX; d2=(ch=='*'||ch=='<')?2520/d:MAX; } else { x=j+(m+1)*(ver-1);//纵向的是[x][x+m+1] y=j+(m+1)*ver; d1=(ch=='*'||ch=='v')?2520/d:MAX; d2=(ch=='*'||ch=='^')?2520/d:MAX; } map[x][y]=d1; map[y][x]=d2; } if(i&1) hor++; //横向加 1 else ver++; } ans=Dijkstra(1,(n+1)*(m+1));//最后点数 if(MAX==ans) printf("Holiday\n"); else printf ("%d blips\n",ans); } return 0; }