程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> UVA216 Getting in Line

UVA216 Getting in Line

編輯:C++入門知識

 


使用暴利枚舉所有可能的排列,找出最小花費時候的排列即可。

使用一個數組來保存輸入,使用一個數組來產生排列,使用另外一個數組來保存當期最小花費時候的排列。


 

for(int i=0;i<pointNumber;i++) 
  { 
      cin>>input[i].x>>input[i].y; 
      array[i]=i; 
      //一定要在這裡給solution賦初始值,負責solution裡面可能是空的  
      solution[i]=i; 
  } 

      for(int i=0;i<pointNumber;i++)
        {
            cin>>input[i].x>>input[i].y;
            array[i]=i;
            //一定要在這裡給solution賦初始值,負責solution裡面可能是空的
            solution[i]=i;

        }一定要在初始的時候就給保存結果的數組賦初始值,因為第一個排列可能就是最優解。如果第一個就是最優解的話那麼..........我就是因為沒有給它賦值,而Wrong Answer的好多次.

 

具體看代碼:


 

#include<iostream>  
#include<algorithm>  
#include<cmath>  
#include<cstdio>  
#include<cstring>  
using namespace std; 
struct point 
{ 
    int x; 
    int y; 
}input[10];     //記錄坐標  
double getDistance(double,double,double,double); 
int main() 
{ 
    int pointNumber; 
    int count=1; 
    while(cin>>pointNumber,pointNumber!=0) 
    { 
        int solution[8];     //存儲每次更新後的順序  
        int array[8]; 
        for(int i=0;i<pointNumber;i++) 
        { 
            cin>>input[i].x>>input[i].y; 
            array[i]=i; 
            //一定要在這裡給solution賦初始值,負責solution裡面可能是空的  
            solution[i]=i; 
        } 
 
        double minCost; 
        double tempNumber=0; 
        for(int i=0;i<pointNumber-1;i++) 
            tempNumber+=getDistance(input[array[i]].x,input[array[i]].y,input[array[i+1]].x,input[array[i+1]].y); 
        minCost=tempNumber; 
        while(next_permutation(array,array+pointNumber)) 
        { 
            //計算對應全排列時的花費  
            tempNumber=0; 
            for(int i=0;i<pointNumber-1;i++) 
            { 
                tempNumber+=getDistance(input[array[i]].x,input[array[i]].y,input[array[i+1]].x,input[array[i+1]].y); 
            } 
            if(tempNumber<minCost) 
            { 
                minCost=tempNumber; 
                memcpy(solution,array,sizeof(array)); 
            } 
        } 
        cout<<"**********************************************************"<<endl; 
        cout<<"Network #"<<count++<<endl; 
        for(int i=0;i<pointNumber-1;i++) 
        { 
            double cost=getDistance(input[solution[i]].x,input[solution[i]].y,input[solution[i+1]].x,input[solution[i+1]].y); 
            printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n", 
                    (int)input[solution[i]].x,(int)input[solution[i]].y,(int)input[solution[i+1]].x,(int)input[solution[i+1]].y, cost+16); 
        } 
        printf("Number of feet of cable required is %.2lf.\n", minCost+16*(pointNumber-1)); 
    } 
    return 0; 
} 
double getDistance(double x1,double y1,double x2,double y2) 
{ 
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 
} 

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
struct point
{
    int x;
    int y;
}input[10];     //記錄坐標
double getDistance(double,double,double,double);
int main()
{
    int pointNumber;
    int count=1;
    while(cin>>pointNumber,pointNumber!=0)
    {
        int solution[8];     //存儲每次更新後的順序
        int array[8];
        for(int i=0;i<pointNumber;i++)
        {
            cin>>input[i].x>>input[i].y;
            array[i]=i;
            //一定要在這裡給solution賦初始值,負責solution裡面可能是空的
            solution[i]=i;
        }

        double minCost;
        double tempNumber=0;
        for(int i=0;i<pointNumber-1;i++)
            tempNumber+=getDistance(input[array[i]].x,input[array[i]].y,input[array[i+1]].x,input[array[i+1]].y);
        minCost=tempNumber;
        while(next_permutation(array,array+pointNumber))
        {
            //計算對應全排列時的花費
            tempNumber=0;
            for(int i=0;i<pointNumber-1;i++)
            {
                tempNumber+=getDistance(input[array[i]].x,input[array[i]].y,input[array[i+1]].x,input[array[i+1]].y);
            }
            if(tempNumber<minCost)
            {
                minCost=tempNumber;
                memcpy(solution,array,sizeof(array));
            }
        }
        cout<<"**********************************************************"<<endl;
        cout<<"Network #"<<count++<<endl;
        for(int i=0;i<pointNumber-1;i++)
        {
            double cost=getDistance(input[solution[i]].x,input[solution[i]].y,input[solution[i+1]].x,input[solution[i+1]].y);
            printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n",
                    (int)input[solution[i]].x,(int)input[solution[i]].y,(int)input[solution[i+1]].x,(int)input[solution[i+1]].y, cost+16);
        }
        printf("Number of feet of cable required is %.2lf.\n", minCost+16*(pointNumber-1));
    }
    return 0;
}
double getDistance(double x1,double y1,double x2,double y2)
{
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}


 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved