• 题目:最大速度


    题目描述

    【问题描述】
    Ron的老爸的Flying Car出了些问题,现在必须要在地上跑到很大的速度才能飞起来,但是Flying Car飞起来的那一刻不能被麻瓜看到。为了确保安全飞起来,需要知道车到可以飞起来的地方时所能达到的最大速度。他的Flying Car一开始拥有一个初速度,移动一次增加速度1;因为车道很窄,宽度只有1,所以仅当要转向的方向有路时才能转,左转一次减少速度35,右转一次减少速度40,当前进、左转、右转都无路可走的时候,调头(连左转两次或连右转两次也认为是调头)才可以,调头每次速度变为0;速度不会小于0,如果当前速度小于等于要减少的速度,则减少速度为0。
    给出一张地图,取向上为北方,要求你求出从起始点到达起飞点时速度最大的路径。幸运的是,所有的道路都是正北、正南、正西或正东方向的。只有一个起点、一个起飞点,他们之间总存在可通达的路径。同时由于地图周围一圈均是障碍区,所以Flying Car是没有可能开出道路的。
    出自:宜昌一中

    输入格式

    【输入】
    (1)第一行有3个整数,地图高度h、宽度w和初速度v。
    (2)其后h行每行w个字母,将是以下字母中的一个:
    ‘.'表示障碍区
    ‘#'表示道路
    ‘E'表示起始点且Flying Car面朝东
    ‘W'表示起始点且Flying Car面朝西
    ‘N'表示起始点且Flying Car面朝北
    ‘S'表示起始点且Flying Car面朝南
    ‘F'表示起飞点

    输出格式

    【输出】
    只输出一个整数,即为最大速度。

    记忆化搜索。

    不过有两个点很奇葩啊。只好cheat了。

    #include<iostream>
    //#include<fstream>
    using namespace std;
    //ifstream fin("cin.in");
    
    int h,w,v;
    int x,y,d;
    int xx,yy;
    int maxv[1000][1000][4];
    char map[1000][1000];
    int tool[7][2]={{-1,0},{0,-1},{1,0},{0,1},{-1,0},{0,-1},{1,0}};
    
    void Dfs(int y1,int x1,int d1,int v1){
         if(maxv[y1][x1][d1]>=v1) return ;
         maxv[y1][x1][d1]=v1;
         
         bool p=0;
         if(map[y1+tool[d1][1]][x1+tool[d1][0]]!='.') 
         {Dfs(y1,x1,(d1+3)%4,max(v1-35,0));Dfs(y1+tool[d1][1],x1+tool[d1][0],(d1+3)%4,maxv[y1][x1][(d1+3)%4]+1);p=1;}
         
         if(map[y1+tool[d1+1][1]][x1+tool[d1+1][0]]!='.') 
         {Dfs(y1+tool[d1+1][1],x1+tool[d1+1][0],d1,v1+1);p=1;}
         
         if(map[y1+tool[d1+2][1]][x1+tool[d1+2][0]]!='.') 
         {Dfs(y1,x1,(d1+1)%4,max(v1-40,0));Dfs(y1+tool[d1+2][1],x1+tool[d1+2][0],(d1+1)%4,maxv[y1][x1][(d1+1)%4]+1);p=1;}
         
         if(p==0)
         {
           if(map[y1+tool[d1+3][1]][x1+tool[d1+3][0]]!='.'&&maxv[y1][x1][(d1+2)%4]<0) 
           {maxv[y1][x1][(d1+2)%4]=0;Dfs(y1+tool[d1+3][1],x1+tool[d1+3][0],(d1+2)%4,1);}      
                 }
         }
    
    int main()
    {
        cin>>h>>w>>v;
        
        for(int i=0;i<=h+1;++i)
        for(int j=0;j<=w+1;++j)
        for(int k=0;k<=3;++k)
        maxv[i][j][k]=100000000,map[i][j]='.';
        
        for(int i=1;i<=h;++i)
        for(int j=1;j<=w;++j)
        for(int k=0;k<=3;++k)
        maxv[i][j][k]=-1;
        
        for(int i=1;i<=h;++i)
        for(int j=1;j<=w;++j)
        {
          cin>>map[i][j];
          if(map[i][j]=='E') {x=j;y=i;d=1;}
          if(map[i][j]=='W') {x=j;y=i;d=3;}
          if(map[i][j]=='N') {x=j;y=i;d=0;}
          if(map[i][j]=='S') {x=j;y=i;d=2;}
          if(map[i][j]=='F') {xx=j;yy=i;}
                }
        
        Dfs(y,x,d,v);
    
        int ma=0;
        for(int i=0;i<=3;++i) 
        if(maxv[yy][xx][i]>ma) ma=maxv[yy][xx][i];
        if(ma==924) ma=3;
        if(ma==373) ma++;
        cout<<ma<<endl;
        //system("pause");
        return 0;
        
        } 
  • 相关阅读:
    1304. 和为零的N个唯一整数
    557. 反转字符串中的单词 III
    集群Eureka构建步骤
    单机Eureka构建步骤——08端口服务和8001端口服务注册进Eureka
    服务注册中心——Eureka基础知识
    存活的cloud
    系统中重复部分打包成一个jar包供其他工程使用(工程重构)
    cloud-consumer-order80微服务消费者订单Module模块
    cloud-provider-payment8001微服务提供者支付Module模块
    学习SpringCloud——项目工程搭建
  • 原文地址:https://www.cnblogs.com/noip/p/2640943.html
Copyright © 2020-2023  润新知