• Here We Go(relians) Again HDU2722


    处理完输入就是很简单的一题  但是输入好难

    勉强找到一种能看懂的。。。

    #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
    ");
            else
                printf ("%d blips
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    终于学会用WinCVS来开源了
    从网上收集EMail(正则表达式,C#源码)
    元宝NewBar发布1.2.0测试版
    使用Gimp切图
    shell编程笔记
    poj2485
    poj 3630 字典树
    杭电oj题目和分类
    强连通分量Kosaraju算法
    随机数的产生
  • 原文地址:https://www.cnblogs.com/bxd123/p/10331565.html
Copyright © 2020-2023  润新知