# 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
麻烦先把代码格式处理好再发出来
刚刚弄懂Markdown格式,已改
@り罐罐。: 问题出在scanf函数上,百度一个 scanf for 就知道了。 加 printf 可以运行,相当于强制线程切换了。
@Adming: 我百度了一下,那是输入字符型的时候会遇到问题,但我是float类型的,为啥还是不行
@り罐罐。: 建议不要用一个scanf接收多个输入,在循环中记得用fflush(stdin);或getchar()来吸收回车
@Adming: 可以把那一段的代码打一下吗,因为我实在搞不懂,你说的那两个我也都用了,不行。
首先你要学会看程序的返回值, 在看你两个运行情况的截图, 返回值都不是0, 而你的代码在main
函数中应该是返回0的, 说明你的代码都没有正常结束, 也就是都崩了! 最常见的是发生了断错误
即使加了printf, 仅你的第一张图的结果上来看 也是出错的
但实际上, 在我的系统上, 你的代码正常运行
考虑你出现那个问题的原因是编译环境的问题, 重新编译或者换个编译环境试试
另外, 建议做题尽量用double以提高精度, 而且很多函数的返回值都是double的, 比如sqrt
嗯,这是几个月前的问题了。我当时问老师了,她当时的说法和你是差不多的,就是即使有时候代码对了,但是还会出错。然后我又看了《C Primer Plus》这本书上面有说到输入/输出缓冲区的概念,我的理解就是这一块的问题,再后来也没有深究了。还是谢谢你
麻烦好好整理一下格式
– 不如隐茶去 4年前