std::cin重复读取相同值致程序无限循环问题求助
输入读取异常导致程序无限循环求助
我正在解决一道Online Judge编程题,代码能正常处理前两个测试用例,但在第三个测试用例(m=11, n=16)时陷入无限循环。调试后发现,执行std::cin >> m >> n;时无法读取新的输入值,m和n始终保持原值,导致循环无法终止,求解决办法。
我的代码
#include <algorithm> #include <functional> #include <iostream> #include <utility> #include <vector> #include <map> #include <limits> typedef unsigned int ui; int main(){ std::ios::sync_with_stdio(false); std::cin.tie(0); ui m,n; std::cin >> m >> n; while(m){ std::vector<int> objects(n); for(auto i = 0u; i < n; i++){ std::cin >> objects[i]; } //memoizacion std::map<std::pair<ui, ui>, ui> mem; std::function<ui(std::pair<ui, ui>)> question = [&](std::pair<ui, ui> set) -> ui { if(!mem.count(set)){ int inSet = 0; for(auto i = 0u; i < n; i++){ if(((objects[i] & set.first) == set.first) and (((~objects[i]) & set.second) == set.second)) inSet++; } if(inSet <= 1) mem.insert(std::pair<std::pair<ui, ui>, ui>(set, 0)); else { ui min = std::numeric_limits<ui>::max(); for(auto k = 1u, i = 0u; i < m; i++, k <<= 1){ if(!(k & set.first) and !(k & set.second)){ ui candidate = std::max(question(std::pair<ui,ui>(set.first | k, set.second)), question(std::pair<ui, ui>(set.first, set.second | k))); min = min < candidate ? min : candidate; } } mem.insert(std::pair<std::pair<ui, ui>, ui>(set, min + 1)); } } return mem.at(set); }; std::cout << question(std::pair<ui, ui>(0,0)) << "\n"; std::cin >> m >> n; } }
问题细节
运行示例输入时,前两个测试用例正常输出,但第三个测试用例触发无限循环。跟踪发现循环末尾的std::cin >> m >> n;执行后,m和n的值没有更新为输入的下一组数据,始终停留在当前测试用例的m=11、n=16,导致while(m)条件永远成立,循环无法退出。
内容的提问来源于stack exchange,提问作者Francisco José Letterio
相关产品推荐
相关产品推荐

