You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:35:37