求解一道C题目,代码已完成,编译错误???
因刚创建帐号,分数不多,不过已经是全部分数了,望大家帮忙.错误是,输入的点高于一定数量时会直接跳过编译,输出gift=XXXXXX(一个很大的数字);
这是题目:
圣诞节的礼物
描述
看到吴清锋老师给大家送了很多礼物,swgr决定也送大家一些礼物。但是这个礼物可没那么容易被拿到!他将所有的礼物放在了一个一个的梅花桩上,你只有走到了那个梅花桩上才能拿到那个礼物。但是这样有的人根本就拿不到礼物!旺旺想要知道,他到底能不能拿到礼物……
输入
第一行为两个正整数n和一个正数d(小数点后不会超过两位),分别代表梅花桩的数目和旺旺能跨越的最远距离。
下面n行有三个数x,y和f。x和y代表这个桩的坐标(小数点后不会超过两位),f保证只有可能取-1,0,1中的一个值。当f=-1时,意味着这是旺旺的起点(起点有且仅有一个);当f=0时,代表这个桩没有礼物;当f=1时,代表这个桩有一物。
n <= 50; 0 <= d <= 100; -100 <= x, y <= 100
输出
一个整数,代表旺旺能拿到的最多礼物数量。
(样例见下页)Sample1
样例输入
2 2
0 0 -1
0 1 1
样例输出
1
Sample1
样例输入
2 2
0 0 -1
0 2 1
样例输出
1
Sample2
样例输入
2 2
0 0 -1
0 3 1
样例输出
0
以下是本人写的代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define TRUE 1
#define FALSE 0
#define GIFT 1
#define NOGIFT 0
#define BEGIN -1
#define TEST FALSE
struct point{
float x;
float y;
int state;
int tried;
};
int gift=0;
int getpoint(struct point point[],int i,FILE *fp)
{fscanf(fp,"%f%f%d",&point[i].x,&point[i].y,&point[i].state);
point[i].tried=FALSE;
return 0;
}
int putpoint(struct point point[],int i)
{printf("%.2f %.2f %d %d \n",point[i].x,point[i].y,point[i].state,point[i].tried);
return 0;
}
int getgift(struct point point[],int stand,int n,float distance)
{
int i;
float space;
if(point[stand].tried) return 0;
if(point[stand].state==GIFT) {gift++; point[stand].state=NOGIFT;}
point[stand].tried=TRUE;
for(i=0;i<n;i++)
{ if(point[i].tried) continue;
space=(float)sqrt(pow((point[stand].x-point[i].x),2)+pow((point[stand].y-point[i].y),2));
if(space-distance<1e-6)
if(getgift(point,i,n,distance)) return 1;
}
return 0;
}
int main()
{
struct point point[50];
int n,i,t;
float distance;
FILE *fp;
#if (TEST==TRUE)
if((fp=fopen("ttt","r"))==NULL)
{printf("Cannot open it\n");system("pause");return 0;}
#else
fp=stdin;
#endif;
fscanf(fp,"%d%f\n",&n,&distance);
for(i=0;i<n;i++){
getpoint(point,i,fp);
#if (TEST==TRUE)
putpoint(point,i);
#endif
}
for(i=0;i<n;i++){
if(point[i].state ==BEGIN)
getgift(point,i,n,distance);
for(t=0;t<n;t++)
point[i].tried =FALSE;
}
printf("%d\n",gift);
system("pause");
return 0;
}