0条评论
还没有人评论过~
# include<stdio.h>
# include<math.h>
# include<stdlib.h>
# include<stdbool.h>
#define SAFE 50
struct
{
int N; //鳄鱼数量
float D; //能跳的最远距离
struct crocodile *C;
}Lake; //因为只用到一个此结构体,所以直接声明并定义
struct crocodile
{
float x, y; //横纵坐标
int v; //是否遍历过(鳄鱼是否被踩过), 0代表否,1代表是
};
float land = 15.0/2;
void CreateLake();
bool DFS(struct crocodile *S);
bool IsSafe(struct crocodile S);
float Distance (struct crocodile a1, struct crocodile a2);
int main()
{
int i;
scanf("%d %f", &Lake.N, &Lake.D);
CreateLake(); //建图
//for(i=0; i<=Lake.N; ++i) //检查图创建是否正确
// printf("%f, %f, %d\n", Lake.C[i].x, Lake.C[i].y, Lake.C[i].v);
if(DFS(&(Lake.C[0]))) printf("Yes\n");
else printf("No\n");
free(Lake.C); //一定要释放
return 0;
}
void CreateLake()
{
int i;
Lake.C = malloc(Lake.N +1 * sizeof(struct crocodile)); //N+1方便运算
Lake.C[0].x = Lake.C[0].y = Lake.C[0].v = 0; //C[0]当做小岛的中心
for(i=1; i<=Lake.N; ++i){
//printf("a\n"); //这出的问题---------------------------------------------
Lake.C[i].v = 0;
scanf("%f %f", &(Lake.C[i].x), &(Lake.C[i].y));
}
}
bool DFS(struct crocodile *S)
{
int i;
if(0==S->x && 0==S->y) //因为小岛有直径,所以第一次跳,要加上半径,不能和其他一块进行
for(i=1; i<=Lake.N; ++i){
if(Lake.D >= (Distance(*S, Lake.C[i]) - land))
DFS(&(Lake.C[i]));
}
else{
S->v = 1; //遍历(跳)即标记
if(IsSafe(*S)) return true;
else{
for(i=1; i<=Lake.N; ++i){
if(!(Lake.C[i].v) && Lake.D >= Distance(*S, Lake.C[i]))
DFS(&(Lake.C[i]));
}
return false;
}
}
}
bool IsSafe(struct crocodile S)
{
if(SAFE <= fabs(S.x)+Lake.D || SAFE <= fabs(S.y)+Lake.D)
return true;
else return false;
}
float Distance (struct crocodile a1, struct crocodile a2)
{
return sqrt(pow((a1.x-a2.x), 2) + pow((a1.y-a2.y), 2));
}
在函数CreateLake里的for循环里,如果不加上printf程序运行不正确,这是为什么?求大佬解答
这是MOOC浙江大学数据结构的一道题
第二张图没输出就是没加printf的,跑到那里就卡住了
haoba
麻烦先把代码格式处理好再发出来
首先你要学会看程序的返回值, 在看你两个运行情况的截图, 返回值都不是0, 而你的代码在main
函数中应该是返回0的, 说明你的代码都没有正常结束, 也就是都崩了! 最常见的是发生了断错误
即使加了printf, 仅你的第一张图的结果上来看 也是出错的
但实际上, 在我的系统上, 你的代码正常运行
考虑你出现那个问题的原因是编译环境的问题, 重新编译或者换个编译环境试试
另外, 建议做题尽量用double以提高精度, 而且很多函数的返回值都是double的, 比如sqrt