2011年蓝桥杯之最小距离
稀里糊涂的就进了今年的决赛,在网上Down了份去年的试题,感觉最后一题有点小麻烦.这两天反复琢磨了下大致实现思路:
分别以每个点为起点进行一次广搜,搜到4个点计算最短平均距离即可.
开始没注意点是可以重复的,所以搞的我无比郁闷.
看了下评分标准,里面说最大时间不超过一分钟......不想说什么了.
#include <algorithm> #include <functional> #include <math.h> const int MAX=1001; int map[MAX][MAX]; int fx[4][2]={{0,-1},{1,0},{0,1},{-1,0}}; int vis[MAX][MAX],q[MAX*MAX][2],p[MAX][2]; double L=0xffffffff; double distant(int *p1,int *p2) { return sqrt(pow((double)abs(p1[0]-p2[0]),2)+pow((double)abs(p1[1]-p2[1]),2)); } void bfs(int x,int y) { int h=0,f=0,pl=0; memset(vis,0,sizeof(vis)); q[f][0]=x; q[f][1]=y; vis[y][x]=1; f++; for(int i=0;i<map[y][x];i++) { p[pl][0]=x; p[pl][1]=y; pl++; } while(f>h && pl<4) { for(int i=0;i<4&&pl<4;i++) { int nx=q[h][0]+fx[i][0]; int ny=q[h][1]+fx[i][1]; if(nx>0 && nx<MAX && ny>0 && ny<MAX && !vis[ny][nx]) { if(map[ny][nx]) { for(int im=0;im<map[ny][nx]&&pl<4;im++) { p[pl][0]=nx; p[pl][1]=ny; pl++; } } vis[ny][nx]=1; q[f][0]=nx; q[f][1]=ny; f++; } } h++; } double t=0; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { if(i!=j) { t+=distant(p[j],p[i]); } } } t=t/12; if(t>0.000001 && t<L) { L=t; } } void compute() { for(int y=1;y<=MAX;y++) { for(int x=1;x<=MAX;x++) { if(map[y][x]) { bfs(x,y); } } } } int main() { FILE *fp; fp=fopen("in.txt","r"); if(fp!=NULL) { memset(map,0,sizeof(map)); int x,y; while(fscanf(fp,"%d,%d",&x,&y)!=EOF) { map[y][x]++;//点可以有重复的哦亲~ } compute(); printf("%.2f\n",L); } else { printf("No Find In.txt\n"); } system("pause"); return 0; }