回 帖 发 新 帖 刷新版面

主题:一道难题

问题在2楼
下面的代码是问题里面前3张图的,有没有哪位高手帮我把后面的程序完成。有什么疑问可以联系我QQ:369710920           我个人对后面3张图的理解是这样的:
1、创建3个井组,按照已经分好井组的方式分配给3个井组;
2、按分配好的坐标集合,计算中心坐标(Xc1,Yc1)...(Xc3,Yc3)即是配水间(转油站)位置;
3、计算各组内所有井到这3口配水间的距离,按照距离最小的原则把注水井重新划入距离最近的配水间。从而得到一次划分。
4、计算各组所有的井到相应配水间的距离的总和L(j) ,并且找出其中的最大值,并令其为 L(k)=maxL(j),再判断是否满足|Z(k)-L(k)|< ε,式中的ε为给定的精度(ε尽量小),如果这个判断条件得到满足,则整个循环结束;
5、若条件不满足,令Z(k)=L(k) ,则回到步骤2,直到满足|Z(k)-L(k)|< ε为止。



前3张图的代码是:
#include <iostream>
#include <cmath>
using namespace std;

#define   N 8
#define   R 0.2
#define   maxSize 6

class list;

class well
{
private:
     double x,y;
     int num;
     bool b;
public:
     well():b(true){}
     ~well(){}
     void input(){cin>>num>>x>>y;}
     void output(){cout<<num<<' ';}
     void incorporate(){b=false;}
     int getNum(){return num;}
     double getX(){return x;}
     double getY(){return y;}
     double distance(well &a){return sqrt(pow((x-a.getX()),2.0)+pow((y-a.getY()),2.0));}
     bool isInGroup(){return b;}
};

class node
{
     friend list;
private:
     well w[N];
     int len;
     node *next;
public:
     node():len(0),next(NULL){}
     ~node(){}
     void print();
     void insert(well &x){w[len++]=x;}
     bool judge(well&);
     bool isFull(){return len==maxSize;}
};

bool node::judge(well &x)
{
     int i;
     for(i=0;i<len;i++)
         if(w[i].distance(x)>2*R) break;
     return i==len;
}
void node::print()
{
     for(int i=0;i<len;i++)
         cout<<w[i].getNum()<<' ';
     cout<<endl;
}

class list
{
private:
     node *head,*last;
public:
     list(){head=new node;last=head;}
     ~list();
     node *getNode(){return last;}
     int createNewNode();
     void print();
};

int list::createNewNode()
{
     node *p=new node;
     if(p==NULL) return 0;
     last->next=p;
     last=p;
     return 1;
}

void list::print()
{
     node *p=head->next;
     while(p!=NULL)
     {
         p->print();
         p=p->next;
     }
}

list::~list()
{
     node *p=head->next;
     while(p!=NULL)
     {
         head->next=p->next;
         delete p;
         p=head->next;
     }
     delete head;
}
int isComplete(well *w)
{
     int i;
     for(i=0;i<N;i++)
         if(w[i].isInGroup()) break;
     return i;
}
int main()
{
     well w[N];
     list l;
     int i,j;
     for(i=0;i<N;i++)
         w[i].input();
     for(i=0;i<N;i++)
     {
         if((i=isComplete(w))==N) break;
         l.createNewNode();
         node *p=l.getNode();
         p->insert(w[i]);
         w[i].incorporate();
         for(j=i+1;j<N;j++)
         {
             if(p->isFull()) break;
             while(!w[j].isInGroup()) j++;
             if(p->judge(w[j]))
             {
                 p->insert(w[j]);
                 w[j].incorporate();
             }
         }
     }
     l.print();
     return 0;
}
[url=http://techbbs.zol.com.cn/1/10_2655.html]http://techbbs.zol.com.cn/1/10_2655.html[/url][url=http://techbbs.zol.com.cn/1/10_2655.html]http://techbbs.zol.com.cn/1/10_2655.html[/url][url=http://techbbs.zol.com.cn/1/10_2655.html]http://techbbs.zol.com.cn/1/10_2655.html[/url]

回复列表 (共1个回复)

沙发


问题在[url=http://techbbs.zol.com.cn/1/10_2655.html]http://techbbs.zol.com.cn/1/10_2655.html[/url]

我来回复

您尚未登录,请登录后再回复。点此登录或注册