求助,只得50分,思路清晰(2进制枚举)
查看原帖
求助,只得50分,思路清晰(2进制枚举)
246331
mystic_qwq楼主2023/10/30 11:04

Record

#include<stdio.h>
#include<math.h>
#include<string.h>
int n,full;
float x[16],y[16];
float st[1<<15];
void print(int x){
  char o[15];
  for(int i=0;i<n;++i)
    o[i]=(x&1)^48,x>>=1;
  for(int i=n-1;~i;--i)
    putchar(o[i]);
} 
float sq(float n){return n*n;};
void dfs(float dis,int p,int s){
  st[s]=dis;
  //print(s);printf(" %f %d %d\n",dis,p,s);
  for(int i=1,B=1;i<=n;++i,B<<=1){
    if(!(s&B)){
      float d=sqrt(sq(x[p]-x[i])+sq(y[p]-y[i]))+dis;
      //printf("dis from [p=%d] to [i=%d] is: %f\n",p,i,d-dis);
      if(d>=st[s|B]||d>=st[full])continue;
      dfs(d,i,s|B);
    }
  }
}
main(){
  scanf("%d",&n),full=(1<<n)-1;
  for(int i=0;i<1<<n;++i)st[i]=32767;
  printf("%f\n",*st);
  for(int i=1;i<=n;++i)
    scanf("%f%f",x+i,y+i);
  dfs(0,0,0);
  printf("%.2f",st[full]);
}

2023/10/30 11:04
加载中...