Problem L

简单题意

n*m大小的矩形,起点在左上角, 终点在右下角,里面一个小矩形代表一个block。每个小矩形的边长都是2520, 小矩形的边有一个速度限制,范围是0~9, 0表示这条边不能行驶。输入部分,从上到下,从左到右,  每一条边是  "数字"+“空格”+“符号”的形式, 数字表示这条边的限速, 符号表示这条路是单向(分东西, 南北)的还是双向的。

解题思路形成过程

其实本来打算放弃的因为这个题的题干太吓人了,而且测试数据也是奇形怪状,不过看AC率挺高的,还是硬着头皮试试吧,我们高中班主任说过题干越长题越简单。即使拼命的读,还是好吃力呀。。去看看网上的题意吧,终于弄明白题意,发现输入好复杂呀,要处理很多东西,不过建好图之后只要用dijkstra算法套用一下就行了。

感想

大神好多呀,读题果然不是我的强项。

AC代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int mapp[600][600];
int dijkstra(int start,int n)
{
    int dis[600];
    int visit[600];
    int k,min;
    memset(visit,0,sizeof(visit));
    for(int i=1;i<=n;i++)dis[i]=INF;
    dis[start]=0;
    for(int i=1;i<=n;i++){
        min=INF;
        for(int j=1;j<=n;j++){
            if(!visit[j]&&dis[j]<min){
                min=dis[j];
                k=j;
            }
        }
        visit[k]=1;
        for(int j=1;j<=n;j++){
            if(mapp[k][j]!=0){
                if(dis[j]>dis[k]+mapp[k][j])
                    dis[j]=dis[k]+mapp[k][j];
            }
        }
    }
    return dis[n];
}
int main()
{
    freopen("in.txt","r",stdin);
    int v, h, w;
    char dir;
    while(scanf("%d%d",&v,&h))
    {
        if(v==0 && h==0)break;
        memset(mapp,0,sizeof(mapp));
        int a,b;
        for(int i=0;i<=v;i++){
            for(int j = 1; j <= h; j++){
                scanf("%d %c",&w,&dir);
                if(w == 0)continue;
                a=i*(h+1)+j;
                b=a+1;
                int ti=2520/w;
                if(dir=='*')
                    mapp[a][b]=mapp[b][a]=ti;
                else if(dir=='>')
                    mapp[a][b]=ti;
                else
                    mapp[b][a]=ti;
            }
            if(i!=v){
                for(int j=1;j<=h+1;j++){
                    scanf("%d %c",&w,&dir);
                    if(w==0)
                        continue;
                    a=i*(h+1)+j;
                    b=a+h+1;
                    int ti=2520/w;
                    if(dir=='*')
                        mapp[a][b]=mapp[b][a]=ti;
                    else if(dir=='v')
                        mapp[a][b]=ti;
                    else
                        mapp[b][a]=ti;
                }
            }
        }
        int tt=(v+1)*(h+1);
        int ans=dijkstra(1,tt);
        if(ans!=INF)
            printf("%d blips\n",ans);
        else
            printf("Holiday\n");
    }
    return 0;
}


你可能感兴趣的:(Problem L)