谢谢大家的回答弱弱的题主已经明白了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;
}