64,636
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
struct point
{
int x;
int y;
double t;
};
point points[27];
void setp(point &T,int a,int b,double c)
{
T.x=a;
T.y=b;
T.t=c;
}
int max()
{
int m=0;
for(int i=0;i<26;i++)
if((points[i].x+points[i].y)>(points[m].x+points[m].y))
m=i;
return m;
}
int explore1(point a)
{
int m[25];
int k=0;
for(int j=0;j<26;j++)
if((a.x>=points[j].x) ||(a.y>=points[j].y))
if(points[j].x+points[j].y!=0)
if((a.x!=points[j].x)&&(a.y!=points[j].y))
if((abs(a.x-points[j].x)+abs(a.y-points[j].y)) <(a.x+a.y)/2)
{
m[k]=j;
k++;
}
int q;
if(k)
{
q=rand()%k;
return m[q];
}
else
return 26 ;
}
int explore2(point a,point b)
{
int m[25];int k=0;
for(int j=0;j <26;j++)
if(a.t+b.t+points[j].t <=6.0)
if((b.x!=points[j].x)&&(b.y!=points[j].y)&&(a.x!=points[j].x)&&(a.y!=points[j].y))
if((a.x>=points[j].x) ||(a.y>=points[j].y))
if(points[j].y+points[j].x!=0)
if((abs(a.x-points[j].x)+abs(a.y-points[j].y)) <(a.x+a.y)/3)
{
m[k]=j;
k++;
}
int q=0;
if(k)
{
q=rand()%k;
return m[q];
}
else
return 26 ;
}
int explore3(point a,point b,point c)
{
int m[25];
int k=0;
for(int j=0;j <26;j++)
if((a.t+b.t+c.t+points[j].t <=6.0)&&(a.t+b.t+c.t+points[j].t>=4.2))
if((c.x!=points[j].x)&&(c.y!=points[j].y)&&(b.x!=points[j].x)&&(b.y!=points[j].y)&&(a.x!=points[j].x)&&(a.y!=points[j].y))
if((a.x>=points[j].x)&&(a.y>=points[j].y)&&(points[j].y+points[j].x!=0))
if((abs(a.x-points[j].x)+abs(a.y-points[j].y)) <(a.x+a.y)/3)
{
m[k]=j;
k++;
}
int q;
if(k)
{
q=rand()%k;
return m[q];
}
else
return 26 ;
}
double result(point a,point b,point c,point d)
{
double T=(a.x+a.y+abs(a.x-b.x)+abs(a.y-b.y)+abs(c.x-b.x)+abs(c.y-b.y)+abs(c.x-d.x)+abs(c.y-d.y)+d.x+d.y)*1.0/35+1.0/6;
if(b.t!=0)
T+=1.0/6;
if(c.t!=0)
T+=1.0/6;
if(d.t!=0)
T+=1.0/6;
double M=(a.x+a.y)*0.4+(abs(a.x-b.x)+abs(a.y-b.y))*a.t*1.8+(abs(c.x-b.x)+abs(c.y-b.y))*(a.t+b.t)*1.8+(abs(c.x-d.x)+abs(c.y-d.y))*(a.t+c.t+b.t)*1.8+(d.x+d.y)*(a.t+d.t+c.t+b.t)*1.8;
printf("时间:%f\n花费:%f\n",T,M);
return M;
}
int main(void)
{
for(int w=0;w<8;w++)
{
printf("第%d组结果:\n",w);
srand(time(NULL));
setp(points[0],3,2,1.50);
setp(points[1],1,5,1.50);
setp(points[2],1,5,1.50);
setp(points[3],0,8,0.85);
setp(points[4],3,11,1.3);
setp(points[5],7,9,1.2);
setp(points[6],9,6,2.3);
setp(points[7],14,0,1.5);
setp(points[8],17,3,1.1);
setp(points[9],14,6,2.5);
setp(points[10],10,12,1.8);
setp(points[11],7,14,0.6);
setp(points[12],2,16,1.5);
setp(points[13],11,17,1.5);
setp(points[14],15,12,0.8);
setp(points[15],19,9,1.4);
setp(points[16],22,5,1.2);
setp(points[17],15,19,1.6);
setp(points[18],15,14,1.6);
setp(points[19],20,17,1);
setp(points[20],21,13,2);
setp(points[21],25,16,2.1);
setp(points[22],28,18,1.2);
setp(points[23],5,12,1.9);
setp(points[24],25,7,1.6);
setp(points[25],9,20,1.2);
setp(points[26],9,15,1.5);
setp(points[27],0,0,0.0);
double cost=0;
for(int n=0;n <5;n++)
{
int z=max();
int d=explore1(points[z]);
printf("第%d条路线:\n",n+1);
printf("%d\t%d\t%f\n",points[z].x,points[z].y,points[z].t);
point h=points[d];
int e=explore2(h,points[z]);
printf("%d\t%d\t%f\n",h.x,h.y,h.t);
point j=points[e];
int f=explore3(j,h,points[z]);
printf("%d\t%d\t%f\n",j.x,j.y,j.t);
point p=points[f];
printf("%d\t%d\t%f\n",p.x,p.y,p.t);
cost+=result(points[z],h,j,p);
setp(points[z],0,0,0);
setp(points[d],0,0,0);
setp(points[e],0,0,0);
setp(points[f],0,0,0);
}
printf("总花费:%f",cost);
printf("剩余点为:\n");
for(int s=0;s<27;s++)
{
if((points[s].x+points[s].y+points[s].t)==0)
continue;
else
printf("%d\t%d\t%f\n",points[s].x,points[s].y,points[s].t);
}
}
system("pause");
return 0;
}