【问题标题】:Function receiving different value than passed函数接收与传递不同的值
【发布时间】:2019-05-14 09:42:19
【问题描述】:

我使用 C++ 为 DFS 编写了一个简单的代码,但是我传递的值和函数接收的值不同。打印函数接收到的值说明。

你能帮帮我吗?

#include <bits/stdc++.h>

using namespace std;

void dfs(int i, int j);
char graph[51][51];
int n, m, loop = 0, inx, iny, completed = 0;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int i, j, k, a, b, c;
  cin >> n >> m;

  for (i = 1; i <= n; i++) {
    for (j = 1; j <= m; j++) {
      cin >> graph[i][j];
    }
  }

  for (i = 1; i <= n, completed == 0; i++) {
    for (j = 1; j <= m, completed == 0; j++) {
      inx = i;
      iny = j;
      dfs(i, j);
    }
  }

  if (completed == 1)
    cout << "YES\n";
  else
    cout << "NO\n";

  return 0;
}

void dfs(int i, int j) {
  cout << i << " " << j << "\n"; // for checking values taken by the function

  if (completed)
    return;

  if (i == inx && j == iny) {
    if (loop >= 4)
      completed = 1;
    return;
  }

  // loop will increase exponentially !!!!!!
  int k = loop;
  if (j < m && graph[i][j] == graph[i][j + 1]) {
    loop++;
    dfs(i, j + 1);
  }

  loop = k;
  if (j > 1 && graph[i][j] == graph[i][j - 1]) {
    loop++;
    dfs(i, j - 1);
  }

  loop = k;
  if (i > 1 && graph[i][j] == graph[i - 1][j]) {
    loop++;
    dfs(i - 1, j);
  }

  loop = k;
  if (i < n && graph[i][j] == graph[i + 1][j]) {
    loop++;
    dfs(i + 1, j);
  }
}

如果有人感兴趣,我正在尝试this question

【问题讨论】:

  • 这就是为什么我说它是 Off-Topic。
  • 警告,例如“for(i=1;i
  • 'accepting different value than provided' 除了特定的多线程场景(另一个线程无效地覆盖当前堆栈),我在 15 年的专业软件开发中从未见过这种情况.但是您在任何递归调用中都写出来,并且可能很容易混淆输出。您可以尝试根据调用深度进行缩进,这样可以更好地了解正在发生的事情。
  • 无法用我的缩短变体重现:int main(int argc, char* argv[]) { memset(graph, 0, sizeof(graph)); n = m = 4; for (int i = 1; i &lt;= n &amp;&amp; completed == 0; i++) { // ... - 输出完全符合预期 (1, 1), (1, 2), ...

标签: c++ function c++14 depth-first-search


【解决方案1】:

至少部分问题在于您不了解运算符在 C++ 中的工作方式。

for(i=1;i

表达式i&lt;=n,completed==0 具有计算i &lt;= n、丢弃结果、然后计算completed == 0 并给出结果的效果。

所以循环的结束条件本质上是completed == 0in 之间的关系不影响循环的执行。

当然还有其他问题,但我没有进一步研究。

Read about comma operator

【讨论】:

  • 哇 ........谢谢你。这件事没有解释清楚。将 i
  • 该错误导致循环超出预期范围。由于dfs() 是递归的,您可能对将哪个值传递给哪个递归调用感到困惑。
  • 至少第一个应该是正确的。第一个打印应该是 1 1 。不是吗?
  • 视情况而定。在不知道您为程序提供哪些输入的情况下 - 因为您没有提供输入示例 - 不可能说,有很多方法 - 根据输入的值 - 您的程序可能具有未定义的行为 -特别是因为您的数组索引关闭了 1(C++ 数组索引是从零开始的)。当行为未定义时,结果可能会非常违反直觉 - 没有必要解释为什么它以任何特定方式表现出来。
  • 我想你可以试试提供的问题链接。它包含一些测试用例。
猜你喜欢
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多