Как исправить этот вывод кода не отображается у крыс в проблеме булавы - PullRequest
0 голосов
/ 27 июня 2019

Я решаю эту проблему крысы в ​​булаве рекурсией.Лабиринт задается в виде N * N двоичной матрицы блоков, где исходный блок является самым верхним левым блоком, т. Е. Лабиринт [0] [0], а целевой блок является самым правым нижним блоком, т. Е. Лабиринт [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 на 3, чтобы решить только проблему, вывод не показывает

1 Ответ

2 голосов
/ 27 июня 2019

Добро пожаловать в 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(), но вы используете синтаксис для функции объявление , а не для функции , вызывающей .

Во-вторых, после того, как оба ваших цикла с scan() в них, i и j будут равны "3"; Могу поспорить, что вы хотите позвонить move() с i из "0" и j из "0", но это не то значение, которое они будут иметь после этих входных циклов.

В-третьих, говоря о 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], но a и b имеют тип int[20][20]; Ваш ввод заполняется (часть) a и b, но вы не сможете передать a или b в качестве аргументов массива move() и recursion().

Я даже не изучал логику ваших функций. Вероятно, есть еще несколько вопросов.

Я настоятельно рекомендую вам начать намного меньше и намного проще. например, вот гораздо более простая программа, которая компилируется как есть без предупреждений и даст вам немедленную обратную связь о том, что она делает. Добавьте к этому небольшими шагами, включая соответствующие выходные строки, чтобы вы могли точно видеть, как все это принимает форму.

#include <stdio.h>

int main() {
  int i, j, n = 3, input;

  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      scanf("%d", &input);
      printf("input is : %d\n", input);
      }
  }

  printf("i and j are : %d, %d\n", i, j);

  return 0;
}

Удачи вам в изучении C - впереди вас ждут большие вещи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...