for循环输入,中间如果不加输出(什么输出都行),程序错误

2020-03-01 09:06发布

问题:

# 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的,跑到那里就卡住了

回答1:

haoba



回答2:

麻烦先把代码格式处理好再发出来



回答3:

首先你要学会看程序的返回值, 在看你两个运行情况的截图, 返回值都不是0, 而你的代码在main函数中应该是返回0的, 说明你的代码都没有正常结束, 也就是都崩了! 最常见的是发生了断错误

即使加了printf, 仅你的第一张图的结果上来看 也是出错的

但实际上, 在我的系统上, 你的代码正常运行

考虑你出现那个问题的原因是编译环境的问题, 重新编译或者换个编译环境试试

另外, 建议做题尽量用double以提高精度, 而且很多函数的返回值都是double的, 比如sqrt