让人郁闷的题目,wa到死了,必须要把判断10.0和1000.0的条件放到prim函数外面去。如代码所放。。。。
正确的(放在prim外):
//2个小岛之间的距离不能小于10米,也不能大于1000米,不能无视! #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; #define M 110 double mat[M][M]; struct tt { double x,y; }dian[M]; double prim(int n,int sta) { double sum=0.0,dis[M]; int mark[M],i,j; for(i=0;i<n;i++) { dis[i]=mat[sta][i]; mark[i]=0; } mark[sta]=1; for(i=1;i<n;i++) { double minn=999999.0; int flag=-1; for(j=0;j<n;j++) { if(minn>dis[j]&&mark[j]==0) { flag=j; minn=dis[j]; } } if(flag==-1) return -1.0; else { mark[flag]=1; sum+=dis[flag]; for(j=0;j<n;j++) { if(dis[j]>mat[flag][j]) dis[j]=mat[flag][j]; } } } return sum; } int main() { int t,i,j,n; double ans,a; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i<n;i++) for(j=0;j<n;j++) mat[i][j]=999999.0; for(i=0;i<n;i++) { scanf("%lf%lf",&dian[i].x,&dian[i].y); for(j=0;j<i;j++) { a=sqrt((dian[i].x-dian[j].x)*(dian[i].x-dian[j].x)+(dian[i].y-dian[j].y)*(dian[i].y-dian[j].y)); if(a>=10.0&&a<=1000.0)//原来要把判断放在prim函数的外面啊,,,, mat[i][j]=mat[j][i]=a; } } ans=prim(n,0); if(ans<0) printf("oh! "); else printf("%.1lf ",ans*100); } return 0; }
错误的(放在了prim里):
//2个小岛之间的距离不能小于10米,也不能大于1000米,不能无视! #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; #define M 110 double mat[M][M]; struct tt { double x,y; }dian[M]; double prim(int n,int sta) { double sum=0.0,dis[M]; int mark[M],i,j; for(i=0;i<n;i++) { dis[i]=mat[sta][i]; mark[i]=0; } mark[sta]=1; for(i=1;i<n;i++) { double minn=999999.0; int flag=-1; for(j=0;j<n;j++) { if(minn>dis[j]&&mark[j]==0&&dis[j]>=10.0&&dis[j]<=1000.0)//放在prim里面是wa的,虽然我不知道为什么 { flag=j; minn=dis[j]; } } if(flag==-1) return -1.0; else { mark[flag]=1; sum+=dis[flag]; for(j=0;j<n;j++) { if(dis[j]>mat[flag][j]) dis[j]=mat[flag][j]; } } } return sum; } int main() { int t,i,j,n; double ans,a; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i<n;i++) for(j=0;j<n;j++) mat[i][j]=999999.0; for(i=0;i<n;i++) { scanf("%lf%lf",&dian[i].x,&dian[i].y); for(j=0;j<i;j++) { a=sqrt((dian[i].x-dian[j].x)*(dian[i].x-dian[j].x)+(dian[i].y-dian[j].y)*(dian[i].y-dian[j].y)); mat[i][j]=mat[j][i]=a; } } ans=prim(n,0); if(ans<0) printf("oh! "); else printf("%.1lf ",ans*100); } return 0; }
求知情人告诉我为什么放在里面就不行?