在钉头锤问题中,如何解决此代码输出未在鼠中显示

时间:2019-06-27 00:32:40

标签: c

我正在通过递归解决这只老鼠的狼牙棒问题。      迷宫作为块的N * N二进制矩阵给出,其中源块是最左上的块,即maze [0] [0],而目标块是最右下块的块,即maze [N-1] [N-1] 。老鼠从源头开始,必须到达目的地。老鼠只能在两个方向上移动:向前和向下。 在迷宫矩阵中,0表示该块是死胡同,而1表示该块可以在从源到目的地的路径中使用。请注意,这是典型迷宫问题的简单版本。

我自己编写的这段代码,但未显示输出

#include <stdio.h>

//#where a[][] means denoting maze and b[][] means solution matrix and i put all zero in b[][]

int move(int a[3][3], int, int);

int recursion(int a[3][3], int b[3][3], int i, int j);

int main() {
  int i, j, n = 3, a[20][20], b[20][20];
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++)
      scan("%d", &a[i][j]);
    print("\n");
  }
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++)
      scan("%d", &b[i][j]);
    print("\n");

  }
  int move(int a[3][3], int i, int j);

  int recursion(int a[3][3], int b[3][3], int i, int j);

  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++)
      print("%d", b[i][j]);
    print("\n");
  }
  return 0;
}

int recursion(int a[3][3], int b[3][3], int i, int j) {

  if (move(a, i, j) == 1) {
    b[i][j] = 1;
    if (recursion(a, b, i, j + 1) == 1)
      return 1;
    if (recursion(a, b, i + 1, j) == 1)
      return 1;

    b[i][j] = 0;
    return -1;
  }

  return -1;
}

int move(int a[3][3], int i, int j) {
  int n = 3;
  if (i >= 0 && i < n && j >= 0 && j < n && a[i][j] == 1) {
    return 1;
  }
  return -1;
}

此代码不显示输出,请帮助我它不显示输出的错误在哪里。

我希望结果会是如果我使用迷宫阵列
例如a [] []是迷宫矩阵

110
101
 111
在解决方案矩阵中

并打印b [] []表示解决方案矩阵 这是我想要的实际解决方案

100
100
111

一切都很好,但是没有显示输出。
在这里,我采用3 x 3矩阵来解决仅输出未显示的问题

1 个答案:

答案 0 :(得分:2)

欢迎使用Stack Overflow,欢迎使用C编程。

您的代码有很多错误。跳到我身上的第一件事是台词:

int move(int a[3][3], int i, int j);

int recursion(int a[3][3], int b[3][3], int i, int j);
main()

内部(第22和24行)。我想您打算在其中调用move()recursion(),但是您使用的语法是针对函数声明的,而不是针对函数 calling < / em>。

第二,在两个循环中都包含scan()之后,ij分别为“ 3”;我敢打赌,您想用move()为“ 0”和i为“ 0”来调用j,但这不是它们在输入循环后将具有的值。

第三,谈到scan(),我的编译器警告scan()print()被隐式定义;从上下文上讲,我打赌您想要scanf()printf()

第四,如果您直接输入:

110
101
111

000
000
000

那么您甚至都没有从输入循环中脱颖而出。您的输入循环总共执行18个输入,因此您的输入将更像:

1
1
0

1
0
1

1
1
1

0
0
0

0
0
0

0
0
0

(这是在我根据上面的注释将scan()替换为scanf()之后的信息。)

第五,您将move()recursion()声明为int[3][3]类型,但将ab定义为{{1 }};您的输入填充了int[20][20]a(的一部分),但您将无法将ba作为数组参数传递给{{1} }和b

我什至没有研究您的功能逻辑。可能还有其他几个问题。

我强烈建议您从小得多和简单得多开始。例如,这是一个更简单的程序,可按原样编译而不会发出警告,并且会立即为您提供有关其运行情况的反馈。逐步添加这些内容,包括相关的输出行,以便您可以确切地了解它们的形成情况。

move()

学习C时祝你好运-前方还有很多事情!