uvaoj216Geting in line---思路+易错+代码

来源:互联网 发布:新网域名客服 编辑:程序博客网 时间:2024/06/11 14:21

uvaoj216

                  Geting in line

   Computer networking requires that the computers in the network be linked.
This problem considers a “linear” network in which the computers are chained together so that each
is connected to exactly two others except for the two computers on the ends of the chain which are
connected to only one other computer. A picture is shown below. Here the computers are the black
dots and their locations in the network are identified by planar coordinates (relative to a coordinate
system not shown in the picture).
Distances between linked computers in the network are shown in feet.
For various reasons it is desirable to minimize the length of cable used.
Your problem is to determine how the computers should be connected into such a chain to minimize
the total amount of cable needed. In the installation being constructed, the cabling will run beneath
the floor, so the amount of cable used to join 2 adjacent computers on the network will be equal to
the distance between the computers plus 16 additional feet of cable to connect from the floor to the
computers and provide some slack for ease of installation.
The picture below shows the optimal way of connecting the computers shown above, and the total
length of cable required for this configuration is (4+16)+ (5+16) + (5.83+16) + (11.18+16) = 90.01
feet.
Input
The input file will consist of a series of data sets. Each data set will begin with a line consisting of a
single number indicating the number of computers in a network. Each network has at least 2 and at
most 8 computers. A value of 0 for the number of computers indicates the end of input.
After the initial line in a data set specifying the number of computers in a network, each additional
line in the data set will give the coordinates of a computer in the network. These coordinates will be
integers in the range 0 to 150. No two computers are at identical locations and each computer will be
listed once.
Output
The output for each network should include a line which tells the number of the network (as determined
by its position in the input data), and one line for each length of cable to be cut to connect each adjacent
pair of computers in the network. The final line should be a sentence indicating the total amount of
cable used.
In listing the lengths of cable to be cut, traverse the network from one end to the
other. (It makes no difference at which end you start.) Use a format similar to the one shown in the
sample output, with a line of asterisks separating output for different networks and with distances in
feet printed to 2 decimal places.
Sample Input
6
5 19
55 28
38 101
28 62
111 84
43 116
5
11 27
84 99
142 81
88 30
95 38
3
132 73
49 86
72 111
0
Sample Output
**********************************************************
Network #1
Cable requirement to connect (5,19) to (55,28) is 66.80 feet.
Cable requirement to connect (55,28) to (28,62) is 59.42 feet.
Cable requirement to connect (28,62) to (38,101) is 56.26 feet.
Cable requirement to connect (38,101) to (43,116) is 31.81 feet.
Cable requirement to connect (43,116) to (111,84) is 91.15 feet.
Number of feet of cable required is 305.45.
**********************************************************
Network #2
Cable requirement to connect (11,27) to (88,30) is 93.06 feet.
Cable requirement to connect (88,30) to (95,38) is 26.63 feet.
Cable requirement to connect (95,38) to (84,99) is 77.98 feet.
Cable requirement to connect (84,99) to (142,81) is 76.73 feet.
Number of feet of cable required is 274.40.
**********************************************************
Network #3
Cable requirement to connect (132,73) to (72,111) is 87.02 feet.
Cable requirement to connect (72,111) to (49,86) is 49.97 feet.
Number of feet of cable required is 136.99.


  题意:就是各个坐标之间连成一条线,使之长度最短,一上来就被坑的不轻,,一看OUTPUT 以为开头是固定的呢!!带了几次都是Wrong answer..,最后在debug里看了看通常输入情况和答案,,然后:

  

7
56 108
127 56
29 132
43 105
30 146
54 135
32 89
0

**********************************************************
Network #1
Cable requirement to connect (127,56) to (32,89) is 116.57 feet.
Cable requirement to connect (32,89) to (43,105) is 35.42 feet.
Cable requirement to connect (43,105) to (56,108) is 29.34 feet.
Cable requirement to connect (56,108) to (54,135) is 43.07 feet.
Cable requirement to connect (54,135) to (29,132) is 41.18 feet.
Cable requirement to connect (29,132) to (30,146) is 30.04 feet.
Number of feet of cable required is 295.62.


从哪个点出发时不固定的!

--------------------------------------------------------------------------------------------------



  本题思路:1. Each network has at least 2 and at most 8 computers.(范围2——8)所以不用担心深搜超时的问题

            2.考察的是深搜,与书上 生成1-n排序 的方法是一样的,如果这个题不熟练,先好好想想怎样生成1-n各种排序序列123456789,123456798,123456879,123456897......

            3.然后再想 其实就是给 这些电脑网点 进行排序出各种序列,每一次计算到下个点的距离,比较出最小的,这里的min 初始值要适当选取 (These coordinates will be integers in the range 0 to 150),所以最多8个,(至少要大于(8-1)*150*根号2 ),其实想怎么设置怎么设置啦,最简单的方法直接1000000000反正是doule类型的,哈哈。


--------------------------------------------------------------------------------------------------


  容易犯的错误:      1.feet有一个 “ .”呦

                      2.加16 ,每两点距离 加上 电脑与地板回见冗余的线16feet(16 additional feet of cable to connect from the floor to the computers and provide some slack for ease of installation.)

                      

    

----已经AC啦--------------------------------------------------------------------------------------

代码:


#include<stdio.h>
#include<string.h>
#include<math.h>
int network[10][2];
double res;
int c[10];
int netlink[10];
int copy[10];
double result(int n , int *p)
{
    int y,x,i;
    double sum=0;
    for(i=0;i<n-1;i++)
    {
      x = network[p[i]][0]-network[p[i+1]][0];
      y = network[p[i]][1]-network[p[i+1]][1];
       
      sum += sqrt(x*x +y*y)+16;
     }
    return sum;
}

void dfs(int n,int count)
{
    int i,j;double t;


  if(n  == count)
  {  

     t = result(n,netlink);
     if(t<res)
     { 
       res=t;
       for(j=0;j<n;j++)
       copy[j] = netlink[j]; 
     }

   }
   else
   {
      for(i=0;i<n;i++)
      {
       if(c[i]==0)
       {
         c[i]=1;
         netlink[count] = i;
         dfs(n,count+1);
         c[i]=0;
        }
       }
    }
}


int main()
{
int n,i,cn=0;
while(1)
{
scanf("%d",&n);
if(n==0)break;
for(i=0;i<n;i++)
{
  scanf("%d %d",&network[i][0],&network[i][1]);
}
                res = 10000.0;
memset(c,0,sizeof(c));
dfs(n,0);
int x,y;
printf("**********************************************************\n");
printf("Network #%d\n",++cn);
        for(i=0;i<n-1;i++)
{
x = network[copy[i]][0]-network[copy[i+1]][0];
   y = network[copy[i]][1]-network[copy[i+1]][1];
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n",network[copy[i]][0],network[copy[i]][1],network[copy[i+1]][0],network[copy[i+1]][1],sqrt(x*x+y*y)+16);


}
printf("Number of feet of cable required is %.2lf.\n",res);

 }

return 0;
}


1 0
原创粉丝点击