问一下佬们这是什么情况,代码用C++写的,数组能在函数里面去定义到源文件,但是我把temp = 0注释掉,编译不通过,貌似是找不到数组,但是却可以去定义啊!!
上面这个情况主函数调用了这个函数
还有就是如果主函数不调用这个函数也不会报错
有知道的嘛求解!
你声明了数组,但是我好像没有看到数组的初始化?
你没有初始化,却去读取其中的数据,肯定有问题
所以在读取到未初始化的数据以后,还要再用temp,因为之前里面的数据是未知的
该问题涉及到渡河问题,需要将农夫、羊、狼、菜带过河,在渡河过程中需要遵守一些条件,如船只能装下农夫和一个角色,羊吃菜,狼吃羊等。根据参考资料中提供的算法设计,可以通过枚举的方式来解决该问题。以下是具体的解决方案:
State
,其中,h 表示农夫,w 表示狼,s 表示羊,v 表示菜。用 0 和 1 表示未渡河和已渡河的状态。struct State {
int h; // 人
int w; // 狼
int s; // 羊
int v; // 菜
};
pass
,用于根据角色进行状态切换。其中,参数 s
为当前状态结构体,参数 role
为要渡过河的角色。根据角色的不同,切换对应的状态。在切换状态之前,需要先切换农夫的状态。State pass(State s, char role) {
s.h = 1 - s.h; // 切换农夫的状态
if(role == '-') {
// 什么都不做
} else if(role == 'W') {
s.w = 1 - s.w; // 切换狼的状态
} else if(role == 'S') {
s.s = 1 - s.s; // 切换羊的状态
} else if(role == 'V') {
s.v = 1 - s.v; // 切换菜的状态
} else {
// 其他情况,直接崩溃
assert(0);
}
return s;
}
passed
,用于标记已尝试的策略。数组大小设为 2 * 2 * 2 * 2
,表示农夫、狼、羊、菜的状态组合。bool passed[2][2][2][2];
invalid_state_check
,用于判断当前状态是否满足条件。具体条件为:人和羊不在同一边时,且羊和狼在同一边或羊和菜在同一边。bool invalid_state_check(State s) {
if(s.h != s.s && (s.s == s.w || s.s == s.v)) {
return true; // 状态不合法
}
return false; // 状态合法
}
final_state_check
,用于判断当前状态是否为最终过河的状态,即人、狼、羊、菜都已经渡过了河。bool final_state_check(State s) {
if(s.h == 1 && s.w == 1 && s.s == 1 && s.v == 1) {
return true; // 是最终状态
}
return false; // 不是最终状态
}
result
,用于存储最终结果的渡河路径。char result[1000];
print_result
,用于打印出当前已经进行的渡河步骤。参数 step
表示当前步骤数。void print_result(int step) {
for(int i = 0; i < step; i++) {
if(i != 0) {
printf(" ");
}
printf("H");
if(result[i] != '-') {
printf("%c", result[i]);
}
}
puts("");
}
go
函数,用于根据当前状态进行递归的渡河尝试。其中,参数 s
表示当前状态,参数 step
表示当前步骤数。bool go(State s, int step) {
// 检测状态是否合法
if(invalid_state_check(s)) {
return false; // 不合法,结束该尝试
}
// 检测是否为最终状态
if(final_state_check(s)) {
// 打印结果
print_result(step);
return true; // 找到一个可行方案,结束该尝试
}
// 检测是否已经尝试过该策略
if(passed[s.h][s.w][s.s][s.v]) {
return false; // 已尝试过,结束该尝试
}
// 标记该策略已经尝试过
passed[s.h][s.w][s.s][s.v] = true;
// 处理下一个状态
State ns;
ns = pass(s, '-');
result[step] = '-';
if(go(ns, step+1)) return true;
if(s.h == s.w) {
result[step] = 'W';
ns = pass(s, 'W');
if(go(ns, step+1)) return true;
}
if(s.h == s.s) {
result[step] = 'S';
ns = pass(s, 'S');
if(go(ns, step+1)) return true;
}
if(s.h == s.v) {
result[step] = 'V';
ns = pass(s, 'V');
if(go(ns, step+1)) return true;
}
return false;
}
main
函数中,初始化 passed
数组,并定义初始状态 init_state
,然后调用 go
函数进行渡河的尝试。int main() {
memset(passed, 0, sizeof(passed));
State init_state = {0, 0, 0, 0};
go(init_state, 0);
return 0;
}
通过以上的具体解决方案,可以解决该问题,实现通过C++编写函数内调用数组。如果编译器报错找不到数组或者注释掉 temp = 0
后无法通过编译的问题,可能是在其他地方对数组 temp
进行了引用或者使用,导致编译器不能优化掉该数组的定义。此外,如果主函数不调用该函数,也不会报错,可能是因为数组 temp
没有被使用到,所以没有发生冲突。