Electric Fences[USACO]

非随机版的模拟退火

 

/*
ID: zhangyc1
LANG: C++
TASK: fence3
*/
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;

int N;
struct SLine 
{
    int nMin, nMax, nConst;
    bool bParallelX;//0 - 平行X轴, 1 - 平行Y轴
};
SLine arrLine[150];
int arrStepX[4] = {1, 0, -1, 0};
int arrStepY[4] = {0, 1, 0, -1};
const int nTries = 50;

double dbMinDistance = 150000.0;
void prepairData()
{
    scanf("%d", &N);
    int n1, n2, n3, n4;
    for (int i = 0; i < N; i++)
    {
        scanf("%d%d%d%d", &n1, &n2, &n3, &n4);
        if (n1 == n3)
        {// 平行Y轴
            arrLine[i].nConst = n1 * 10;
            arrLine[i].bParallelX = false;
            if (n2 < n4)
            {
                arrLine[i].nMin = n2 * 10;
                arrLine[i].nMax = n4 * 10;
            }
            else
            {
                arrLine[i].nMin = n4 * 10;
                arrLine[i].nMax = n2 * 10;
            }
        }
        else
        {// 平行X轴
            arrLine[i].nConst = n2 * 10;
            arrLine[i].bParallelX = true;
            if (n1 < n3)
            {
                arrLine[i].nMin = n1 * 10;
                arrLine[i].nMax = n3 * 10;
            }
            else
            {
                arrLine[i].nMin = n3 * 10;
                arrLine[i].nMax = n1 * 10;
            }
        }
    }
}

double CalDist(int nx, int ny)
{
    double dbSum = 0.0;
    for (int i = 0; i < N; i++)
    {
        int x, y;
        double dbCur = 0.0;
        if (arrLine[i].bParallelX)
        {
            x = ny; y = nx;
        }
        else
        {
            x = nx; y = ny;
        }
        
        if (y >= arrLine[i].nMin && y <= arrLine[i].nMax)
            dbCur = abs(x - arrLine[i].nConst);
        else if (y > arrLine[i].nMax)
            dbCur = sqrt((double)((x - arrLine[i].nConst) * (x - arrLine[i].nConst) + (y - arrLine[i].nMax) * (y - arrLine[i].nMax)));
        else
            dbCur = sqrt((double)((x - arrLine[i].nConst) * (x - arrLine[i].nConst) + (y - arrLine[i].nMin) * (y - arrLine[i].nMin)));

        dbSum += dbCur;
    }
    return dbSum;
}


void process()
{
    int nSelX = 0, nSelY = 0;
    dbMinDistance = CalDist(0, 0);
    int t = 40;
    while (t)
    {
        for (int i = 0; i < nTries; i++)
        {
            int nOldX = nSelX, nOldY = nSelY;
            for (int j = 0; j < 4; j++)
            {
                double db = CalDist(nOldX + t * arrStepX[j], nOldY + t * arrStepY[j]);
                if (db < dbMinDistance)
                {
                    dbMinDistance = db;
                    nSelX = nOldX + t * arrStepX[j];
                    nSelY = nOldY + t * arrStepY[j];
                }
            }
        }
        t = (int)(t * 0.8);
    }
    printf("%.1f %.1f %.1lf\n", nSelX/10.0, nSelY/10.0, dbMinDistance/10);
}

int main(){
    FILE *streamIn = freopen("fence3.in","r",stdin);
    FILE *streamOut = freopen("fence3.out","w",stdout);
    prepairData();
    process();
    fclose(streamIn);
    fclose(streamOut);
    return 0;
}

 

posted @ 2013-05-09 12:06  J.Z's World  阅读(203)  评论(0编辑  收藏  举报