POJ 2814 Mobiles

看不懂题意,觉得很复杂

标程就两步,先求出X,判断同层的杠杆是否相交

自己写的时候只判断线与线是否相交,没考虑点与线了

以前都是用C写的C++代码,写的时候是快,但是几乎不可重用,没有自己的库可调用。每次都要重新写。无法用于工程。

这是第一个C++代码。以后只要不比赛,尽量写C++,命名也要规范,这方面可以多参考标程。

#include <cstdio>
#include <vector>
#include <cstring>
#include <vector>
#include <iostream>
using namespace std;

struct Tree
{
    double weight,width;
    Tree *left,*right,*parent;
    Tree()
        :weight(0.0),width(0.0),left(0),right(0),parent(0){}
    double totalWeight()const;
    bool isBalance() const;
};

double Tree::totalWeight()const
{
    if(left&&right)
        return left->totalWeight()+right->totalWeight();
    return weight;
}

bool Tree::isBalance()const
{
    if(left&&right)
        return left->isBalance()&&right->isBalance()&&left->totalWeight()==right->totalWeight();
    return true;
}

struct Range
{
    double left,right;
    Range(double l,double r):left(l),right(r){}
    bool overLap(Range a)
    {
        return !(left>a.right||right<a.left);
    }
};

Tree *nodes[1010];
vector<vector<Range> > rangeTable;
int n;

void BuildRangeTable(Tree *t,int level,double center)
{
    if(t)
    {
        if(level>=rangeTable.size())
            rangeTable.resize(level+1);
        rangeTable[level].push_back(Range(center-t->width/2,center+t->width/2));
        BuildRangeTable(t->left,level+1,center-t->width/2);
        BuildRangeTable(t->right,level+1,center+t->width/2);
    }
}

bool checkOverLap()
{
    int i,j;
    for(i=0;i<rangeTable.size();i++)
        for(j=1;j<rangeTable[i].size();j++)
            if(rangeTable[i][j].overLap(rangeTable[i][j-1]))
                return false;
    return true;
}

void ReverseTree(int k)
{
    for(;n<k;n++)
        nodes[n]=new Tree();
}

int main()
{
    int i,k,j,m,left,right;
    double width;
    Tree* root;
    char s[11];
    do
    {
        n=0;
        rangeTable.clear();
        for(;scanf("%d",&k),k>0;)
        {
            ReverseTree(k);
            scanf("%s",s);
            if(s[0]=='D')
            {
                scanf("%s",s);
                if(s[0]=='X')
                    m=k;
                else
                    nodes[k-1]->weight=atof(s);
            }
            else
            {
                scanf("%lf%d%d",&width,&left,&right);
                ReverseTree(left);
                ReverseTree(right);
                nodes[k-1]->left=nodes[left-1];
                nodes[k-1]->right=nodes[right-1];
                nodes[k-1]->width=width;
                nodes[left-1]->parent=nodes[right-1]->parent=nodes[k-1];
            }
        }
        root=0;
        for(i=0;i<n;i++)
            if(!nodes[i]->parent)
                root=nodes[i];
        nodes[m-1]->weight=nodes[m-1]->parent->totalWeight();
        bool balance=root->isBalance();
        if(balance)
        {        
            bool swing=balance;
            BuildRangeTable(root,0,0.0);
            swing=checkOverLap();
            printf("Object %d must have weight %.2lf\n",m,nodes[m-1]->weight);
            puts(swing?"The mobile will swing freely.":"The mobile will not swing freely.");
        }
        else
            puts("The mobile cannot be balanced.");
    }while(k>=0);
    return 0;
}
原文地址:https://www.cnblogs.com/xchaos/p/2545840.html