主题:一道难题
问题在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]
下面的代码是问题里面前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]