• 强墙


    描述 Description  

             在一个长宽均为10,入口出口分别为(0,5)、(10,5)的房间里,有几堵墙,每堵墙上有两个缺口,求入口到出口的最短路经。                                       

    输入格式 Input Format

            第一排为n(n<=20),墙的数目。

     接下来n排,每排5个实数x,a1,b1,a2,b2。

     x表示墙的横坐标(所有墙都是竖直的),a1-b1和a2-b2之间为空缺。

     a1、b1、a2、b2保持递增,x1-xn也是递增的。

    输出格式 Output Format    

            输出最短距离,保留2位小数。

     1 #include<iostream>
     2 #include<math.h> 
     3 //#include<fstream> 
     4 #include<stdio.h> 
     5 using namespace std;
     6 
     7 double d[25][5],y[25][5],x[25]; 
     8 int n; 
     9 
    10 int main()
    11 {
    12     int i,j,k,l; 
    13     cin>>n;
    14     
    15     for(j=1;j<=4;++j)
    16     {d[1][j]=0;x[1]=0;y[1][j]=5;} 
    17     
    18     for(i=2;i<=n+1;++i)
    19     {
    20       cin>>x[i];
    21       for(j=1;j<=4;++j) 
    22       cin>>y[i][j],d[i][j]=0xfffffff;
    23             } 
    24             
    25     for(j=1;j<=4;++j)
    26     {x[n+2]=10;y[n+2][j]=5;d[n+2][j]=0xfffffff;} 
    27     
    28     for(i=2;i<=n+2;++i)
    29     {
    30       for(j=1;j<=4;++j)
    31       for(k=1;k<=4;++k) 
    32       d[i][j]=min(d[i][j],sqrt((x[i]-x[i-1])*(x[i]-x[i-1])+(y[i][j]-y[i-1][k])*(y[i][j]-y[i-1][k]))+d[i-1][k]);
    33                        } 
    34     
    35     int s,t; 
    36     for(i=3;i<=n+2;++i)
    37     for(j=1;j<=4;++j)
    38     for(k=i-2;k>=1;--k)
    39     for(l=1;l<=4;++l)
    40     {
    41       for(t=1;t<=4;++t) 
    42       d[i][j]=min(d[i][j],sqrt((x[i]-x[i-1])*(x[i]-x[i-1])+(y[i][j]-y[i-1][t])*(y[i][j]-y[i-1][t]))+d[i-1][t]);
    43       double kik=(y[i][j]-y[k][l]); 
    44       bool p=0; 
    45       for(t=k+1;t<=i-1;++t)
    46       {
    47         p=0; 
    48         for(s=1;s<=4;++s,++s)
    49         {
    50           double kit=(y[i][j]-y[t][s]);
    51           double kit2=(y[i][j]-y[t][s+1]);                 
    52           if(kik*(x[i]-x[t])<=kit*(x[i]-x[k])&&kik*(x[i]-x[t])>=kit2*(x[i]-x[k])) p=1;                  
    53                            }                      
    54         if(p==0) break;  
    55                            } 
    56       if(p==0) continue; 
    57       d[i][j]=min(d[i][j],d[k][l]+sqrt((x[i]-x[k])*(x[i]-x[k])+(y[i][j]-y[k][l])*(y[i][j]-y[k][l]))); 
    58                      } 
    59     
    60     printf("%.2lf",d[n+2][1]); 
    61     cout<<endl; 
    62     return 0; 
    63     } 
  • 相关阅读:
    Centos 7 安装shellcheck
    cunit环境搭建
    flex序列号和破解
    windows下python SSH-Client模块paramiko的安装与修改
    history优化设置
    shell配置和vim配置
    testlink 安装方法
    python解析GBK格式xml文件
    运用Loadrunner测试Mysql数据库性能 TRON•极客
    写python用到的一些大杀器
  • 原文地址:https://www.cnblogs.com/noip/p/2623790.html
Copyright © 2020-2023  润新知