@[FincheuwYggdrasil](/user/551088) 问题找着了
在你递归调用dfs函数的时候,你在调用函数前执行了`m[i] -= mimi, m[j] += mimi;`语句,因此当你在调用函数后,你需要进行回溯操作,不然之后遍历下去的结果就会出问题。
你需要做的是在dfs函数调用之后恢复状态,即插入`m[i] += mimi, m[j] -= mimi;`该行代码即可。
修改后的代码如下:
[AC提交记录](https://www.luogu.com.cn/record/121892791)
``` cpp
#include<iostream>
#include <algorithm>
using namespace std;
int m[3], n[3];
bool vis[40], stp[30][30][30];
void dfs() {
if(stp[m[0]][m[1]][m[2]]) {
return ;
}stp[m[0]][m[1]][m[2]] = 1;
if(!m[0] && !vis[m[2]]) {
vis[m[2]] = 1;
}
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
if(i == j) continue;
int mimi = min(n[j] - m[j], m[i]);
m[i] -= mimi, m[j] += mimi;
dfs();
m[i] += mimi, m[j] -= mimi;
}
}
}
int main()
{
// ofstream cout ("milk3.out");
// ifstream cin ("milk3.in");
cin >> n[0] >> n[1] >> n[2];
m[0] = 0, m[1] = 0, m[2] = n[2];
//stp[m[0]][m[1]][m[2]] = 1;
dfs();
for(int i = 0; i <= 21; i++) {
if(vis[i]) {
cout << i << " ";
}
} cout << endl;
return 0;
}
```
by Macw07 @ 2023-08-20 11:57:20
@[Macw07](/user/866133) 我已经通过了这题,但还是感谢你!
by FincheuwYggdrasil @ 2023-08-20 18:55:39