一無是處 2015-07-25 14:45 采纳率: 0%
浏览 1727

滑雪问题因为全局变量产生的bug

谢谢大家的回答弱弱的题主已经明白了Orz

题目时经典的滑雪问题,最近帮别人查程序的时候看到的。

问题出在程序的第19行的变量tmpMax上。如果这个变量在函数体内声明,就是现在程序那样就不会有问题,但是如果将其定义为全局变量就会出问题。第一个出问题的地方是(2,3)点,我已经让程序在这里输出单步结果了。希望对C/C++熟悉的前辈能够解答一下这个问题,感激不尽!

debug中的代码如下:

 #include <iostream>
#include <stdio.h>
#include <memory.h>
//#include <conio.h>
using namespace std;
int skiing[110][110];
int done[110][110];
int R, C;
int Len = 0;
//int tmpMax;
int Ski(int a, int b){
    bool flag = false;
    if(a == 2 && b == 3){
        printf("dfs(%d %d)\n", a, b);
        flag = true;
    }
    //printf("dfs(%d %d)\n", a, b);
    if (done[a][b] != 0)
        return done[a][b];
    //tmpMax = 1    
    int tmpMax = 1;//警察叔叔就是这个变量!!!!
    if (a - 1 >= 1 && skiing[a - 1][b] < skiing[a][b]){
        int len = Ski(a - 1, b) + 1;
        if (len - tmpMax > 0){
            if(flag) printf("Len = %d  tmpMax = %d\n", len, tmpMax);
            tmpMax = len;
        }
        if(flag){
            printf("tmpMax = %d\n", tmpMax);
            printf("getlen(%d, %d) = %d\n\n", a-1, b, len);
        }
    }
    if (a + 1 <= R && skiing[a + 1][b] < skiing[a][b]){
        int len = Ski(a + 1, b) + 1;
        if (len - tmpMax > 0){
            if(flag) printf("Len = %d  tmpMax = %d\n", len, tmpMax);
            tmpMax = len;
        }
        if(flag){
            printf("tmpMax = %d\n", tmpMax);
            printf("getlen(%d, %d) = %d\n\n", a+1, b, len);
        }
    }
    if (b - 1 >= 1 && skiing[a][b - 1] < skiing[a][b]){
        int len = Ski(a, b - 1) + 1;
        if (len - tmpMax > 0){
            if(flag) printf("Len = %d  tmpMax = %d\n", len, tmpMax);
            tmpMax = len;
        }
        if(flag){
            printf("tmpMax = %d\n", tmpMax);
            printf("getlen(%d, %d) = %d\n\n", a, b-1, len);
        }
    }
    if (b + 1 <= C && skiing[a][b + 1] < skiing[a][b]){
        int len = Ski(a, b + 1) + 1;
        if (len - tmpMax > 0){
            if(flag) printf("Len = %d  tmpMax = %d\n", len, tmpMax);
            tmpMax = len;
        }
        if(flag){
            printf("tmpMax = %d\n", tmpMax);
            printf("getlen(%d, %d) = %d\n\n", a, b+1, len);
        }
    }

    done[a][b] = tmpMax;
    //printf("calc(%d %d) = %d\n", a, b, done[a][b]);
    return done[a][b];
}
int main(){
    cin >> R >> C;
    memset(skiing, 0, sizeof(skiing));
    memset(done, 0, sizeof(done));
    for (int i = 1; i < R + 1; ++i)
        for (int j = 1; j < C + 1; ++j)
            cin >> skiing[i][j];
    for (int i = 1; i < R + 1; ++i){
        for (int j = 1; j < C + 1; ++j){
            //done[i][j] = Ski(i, j);
            Ski(i, j);
            //cout << done[i][j] << " ";
            if (done[i][j] > Len)
                Len = done[i][j];
            //getch();
        }
        //cout << endl;
    }
    for (int i = 1; i < R + 1; ++i){
        for (int j = 1; j < C + 1; ++j){
            cout << done[i][j] << " ";
        }
        cout << endl;
    }
    cout << Len << endl;
    return 0;
}
  • 写回答

4条回答

  • oyljerry 2015-07-25 14:50
    关注

    tmpMax全局变量的区别就是Ski函数每次进入都会拿到上次的值,而如果是局部变量就会每次进入函数都会重新初始化为1。这两个明显会导致结果不一样。

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题