zoukankan      html  css  js  c++  java
  • poj1556

    题目大意:在10*10的空间里,中间有几堵平行于竖直方向的墙,每个墙由两扇门,求从(0,5)-->(10,5)

    的最短路径

    思路:把门边沿的点两点建立一条边(中间无墙挡住),和起点,终点同样建边。。最后就成最短路。。

             网上大部分Dijkstra,其实数据很小,floyed足以搞定。。

     PS:这道题数据很弱,但是弱菜下标写错了。。调了非常久。。。还有看到网上有的写了接近300行代码吓尿了。。

    写的很搓的代码:

      1 /*
      2   Time:2013-03-25 23:56:19
      3   State: Accepted 
      4 */
      5 
      6 #include<iostream>
      7 #include<cstring>
      8 #include<string>
      9 #include<cstdlib>
     10 #include<cstdio>
     11 #include<fstream>
     12 #include<cmath>
     13 #include<algorithm>
     14 #define INF 1000000
     15 #define ee 1e-8
     16 using namespace std;
     17 int n, tot; 
     18 double a[200][6] , map[202][202] ;
     19 int pos[200][6],  p1,  p2 , st , en;
     20 
     21 
     22 void init(){
     23      memset(a, 0, sizeof(a));
     24      tot = 0;
     25      for (int i = 0;  i<= 200; ++i)
     26          for (int j = 0; j <= 200; ++j)
     27             map[i][j] = INF;
     28      for (int i = 1;  i <= n; ++i){
     29          scanf("%lf%lf%lf%lf%lf",&a[i][0], &a[i][1] , 
     30                      &a[i][2] , &a[i][3], &a[i][4] );
     31          for (int j = 1; j <= 4; ++j) pos[i][j] = i + j * n - n;
     32      }
     33 }
     34 
     35 double work_x(double x2, double y2, double x1 , double y1){
     36       return x1*y2 - x2*y1;
     37 }
     38 
     39 void work(double x1 , double y1, double x2 , double y2){
     40      double x , y3 , y4;
     41      bool flag;
     42      for (int i = st; i <= en ; ++i){
     43          flag = 0;
     44          x = a[i][0]; 
     45          y3 = a[i][1];
     46          y4 = a[i][2];
     47          if (work_x(x1 - x , y1 - y3,  0, y4-y3)*work_x(x2 -x , y2 - y3, 0, y4-y3) < 0
     48             && work_x(x-x1 , y3-y1, x2 - x1, y2-y1)*work_x(x-x1 , y4-y1, x2-x1, y2-y1) < 0) flag = 1;
     49          y3 = a[i][3];
     50          y4 = a[i][4];     
     51          if (work_x(x1 -x , y1 - y3,  0, y4-y3)*work_x(x2 -x , y2 - y3, 0, y4-y3) < 0
     52             && work_x(x-x1 , y3-y1, x2 - x1, y2-y1)*work_x(x-x1 , y4-y1, x2-x1, y2-y1) < 0) flag = 1;
     53          if (!flag) return;
     54       
     55      }
     56     map[p2][p1] = map[p1][p2] = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
     57 }
     58 
     59 void solve(){
     60      tot = n * 4 + 1;
     61      for (int i = 1; i <= n; ++i)
     62       for (int k = 1; k <= 4; ++k){
     63       /*  for (int k1 = k + 1; k1 <= 4; ++k1)
     64                   map[pos[i][k1]][pos[i][k]] =
     65                   map[pos[i][k]][pos[i][k1]] = a[i][k1] - a[i][k]; */ 
     66         p1 = pos[i][k];
     67         p2 = tot;
     68         en = n;
     69         st = i + 1;
     70         work(a[i][0],a[i][k],10,5);
     71         p1 = 0;
     72         p2 = pos[i][k];
     73         en = i - 1;
     74         st = 1;
     75         work(0,5,a[i][0],a[i][k]);
     76         for (int j = 1; j < i; ++j)
     77           for (int l = 1; l <= 4 ; ++l){
     78                st = j + 1;
     79                p1 = pos[j][l];
     80                work(a[j][0], a[j][l], a[i][0], a[i][k]);
     81           }
     82         
     83       }   
     84       p1 =0;
     85       p2 = tot;
     86       en = n;
     87       st = 1;
     88       work(0,5,10,5);
     89     /*  for (int i = 0; i <= tot; ++i)
     90         for (int j =i + 1; j <=tot; ++j)
     91           if (map[i][j]!=INF) printf("map[%d][%d] = %lf\n",i , j ,map[i][j]);*/
     92       for (int k = 0; k <= tot; ++k)
     93         for (int i = 0; i <= tot; ++i)
     94            for (int j = 0; j <= tot; ++j){
     95                 if (i == j || j == k || k == i) continue;
     96                 map[i][j] = min(map[i][j], map[i][k] + map[k][j]);
     97            }
     98       printf("%0.2f\n",map[0][tot]);
     99      
    100              
    101 }
    102 
    103 int main(){
    104     freopen("poj1556.in","r",stdin);
    105     freopen("poj1556.out","w",stdout);
    106     while (scanf("%d", &n) != EOF && n != -1){
    107          init();
    108          solve();    
    109     }
    110     fclose(stdin); fclose(stdout);   
    111 }
  • 相关阅读:
    homework2
    homework1
    软工实践个人总结
    实验 7:OpenDaylight 实验——Python 中的 REST API 调用 (选做题)
    第4次作业-结对编程之实验室程序实现
    实验 6:OpenDaylight 实验——OpenDaylight 及 Postman 实现流表下发
    实验 5:OpenFlow 协议分析和 OpenDaylight 安装
    软件工程结对作业需求分析与原型
    实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令
    实验 3:Mininet 实验——测量路径的损耗率
  • 原文地址:https://www.cnblogs.com/yzcstc/p/2981746.html
Copyright © 2011-2022 走看看