为什么这个C ++代码在不同的编译器上提供不同的输出?

时间:2013-08-30 05:20:43

标签: c++ algorithm gcc c++11 compiler-construction

我意识到这个标题在SO上有很多问题,但我发现的所有问题都有i = ++if(f(f(x)))之类的问题,这些问题都不在此代码中。这是对this的回溯解决方案的尝试。我有一些C的经验,但我刚刚开始尝试使用C ++,而且我一直在为练习做Codeforces问题。下面的代码段是该程序的主体。我未展示的main处理输入和输出。为了保持weights的每个堆栈帧尽可能小,我在answermax_depthsolve使用了全局变量。

造成问题的输入是weights = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}max_depth = 1000。当我用g++ std=C++11 file.cpp编译它时,它给出了“4 3 2 3 4 3 2 3 4 ... 3 2 1”,这是正确的答案。当Codeforces编译它时,它会给出“9 10 9 10 9 10 9 10 ......”,这是不正确的。我的猜测是for(int i : weights)遍历向量的顺序不是由标准定义的,但即便如此,我也不明白它为什么会有任何区别。我错过了什么?

#include <iostream>
#include <vector>
#include <sstream>

using namespace std;

string answer = "";
vector<int> weights; 
int max_depth;

bool solve(int left_scale, int right_scale, int last_added, int depth){
  bool is_left = (depth % 2) == 0;

  int new_weight;
  int weight_to_inc = is_left ? left_scale : right_scale;
  int weight_to_exceed = is_left ? right_scale : left_scale;

  if (depth == max_depth){
    return true;
  }


  for(int i : weights){
    if (i != last_added){
      new_weight = weight_to_inc + i;
      if (new_weight > weight_to_exceed){
        bool ans =  solve(is_left ? new_weight : left_scale,
                          is_left ? right_scale : new_weight,
                          i, depth + 1);
        if (ans){
          stringstream ss;
          ss << i;
          answer.append(ss.str() + " ");
          return true;
        }
      }
    }
  }

  return false;
}

void start_solve(void){
  if (solve(0, 0, 0, 0)){
    return;
  }

  answer = "";
}

(我提交的完整代码,如果有任何不同,则为here。)

编辑:

如果有人因为寻找Codeforces问题的答案而绊倒:这段代码的问题是“回答”是相反的。将answer.append(ss.str() + " ")更改为answer = ss.str() + answer是最短的解决方案,可以使其正常运行。

1 个答案:

答案 0 :(得分:7)

  

为什么这个C ++代码在不同的编译器上提供不同的输出?

它没有提供不同的输出。

  

当我用g ++ std = C ++ 11 file.cpp编译它时,它给出了“4 3 2 3 4 3 2 3 4 ... 3 2 1”,这是正确的答案。当Codeforces编译它时,它会给出“9 10 9 10 9 10 9 10 ......”,这是不正确的。

我相信你误解了your test results on the codeforces server

正确答案是“9 10 9 10 ......”。

您的程序输出在代码服务器和本地工作站上都​​是“4 3 2 3 4 3 ...”。

所以你的算法错了,程序的输出是一致的。

您正在混合测试结果“输出”和“答案”上的两个字段。

再次检查您的测试结果。