Случайное блуждание в массиве 10X10 - PullRequest
2 голосов
/ 02 апреля 2020

Напишите программу C, которая генерирует случайный обход массива 10x10. Первоначально массив будет содержать только точечные символы. Программа должна случайным образом «ходить» от элемента к элементу, всегда идя вверх, вниз, влево или вправо на один шаг. Элементы, посещаемые программой, будут помечены буквами от A до Z в порядке посещения.

Не требуется переход к элементу, которому уже присвоена буква (заблокированный элемент). Если все четыре направления заблокированы, программа должна завершиться.

Я написал код для вышеуказанного вопроса, но иногда вывод просто пустой, он просто показывает черный экран.

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main() {
    char visited = 'A';
    char a[10][10];

    // assigning value '.' to array elements
    for (int i = 0; i < 10; i++)
      for (int j = 0; j < 10; j++)
        a[i][j] = '.';

      // the initial is set for the player.

      int playeri, playerj;

      srand(time(0));

      // assigning numbers between 0-9
      playeri = rand() % 10; playerj = rand() % 10;

      a[playeri][playerj] = visited++;

      int move;

      // now to move the player

      while (visited <= 'Z') {
        // to generate numbers between 1-4
        move = rand() % 4 + 1;

        // to move up
        if (move == 1) {
          if (a[playeri - 1][playerj] == '.' && playeri != 0) {
            playeri = playeri - 1;
            a[playeri][playerj] = visited++;
          }
        }

        // to move down
        else if (move == 2) {
          if (a[playeri + 1][playerj] == '.' && playeri != 9) {
            playeri = playeri + 1;
            a[playeri][playerj] = visited++;
          }
        }

        // to move right
        else if (move == 3) {
          if (a[playeri][playerj + 1] == '.' && playerj != 9) {
            playerj = playerj + 1;
            a[playeri][playerj] = visited++;
          }
        }

        // to move left
        else if (move == 4) {
          if (a[playeri][playerj - 1] == '.' && playerj != 0) {
            playerj = playerj - 1;
            a[playeri][playerj] = visited++;
          }
        }
      }

      for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
          printf("%c", a[i][j]);
        }
        printf("\n");
      }
    }

My Предположим, что программа застряла в infinte l oop, если так, как я могу решить эту проблему?

1 Ответ

4 голосов
/ 02 апреля 2020

Ваша программа имеет неопределенное поведение, если вы обращаетесь к массиву a за пределами. Это может произойти, когда случайное направление невозможно, потому что вы достигли границ массива 10x10. Чтобы избежать этого, измените порядок условий для первой проверки индекса, например,

          if (playeri != 0 && a[playeri - 1][playerj] == '.') {

. В некоторых случаях вы, вероятно, окажетесь в позиции, у которой нет смежных позиций с точкой, поэтому нет способа Продолжить. Поскольку visited не увеличивается в этом случае, ваш l oop не прекратит работу.

Дополнительная проверка, что хотя бы одно направление не заблокировано, исправит бесконечное l oop, но не является оптимальным решением.

Ваша реализация, которая генерирует случайное направление, а затем проверяет если это направление возможно, может потребоваться несколько попыток, когда блокируется больше полей. Хотя маловероятно, что вы даже можете получить случайные числа, которые обозначают заблокированные пути в течение длительного времени.

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

Предлагаемый алгоритм:

  • проверить все 4 направления, если можно идти, поместить все возможные направления в массив не более 4 элементов и подсчитать возможные направления как n. (Пример: если возможны вверх, вниз и влево, массив будет содержать up, down, left, (invalid). Количество будет n = 3.)
  • , если n == 0 (все заблокировано) прекратить l oop
  • получить случайное число от 0 до n - 1 (Пример: 0 .. 2)
  • выбрать направление от массив (Пример: случайное число 1 выберет down)
  • переместится в выбранном направлении (это было проверено до того, как это возможно)
...