c - 10X10 数组中的随机游走

标签 c random-walk

编写一个 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");
      }
    }

我的猜测是程序陷入了无限循环,如果是这样,我该如何解决这个问题?

最佳答案

如果您访问数组 a,您的程序将出现未定义的行为出界。当随机方向因到达 10x10 数组的边界而无法实现时,就会发生这种情况。为了避免这种情况,请更改条件顺序以首先检查索引,例如

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

在某些情况下,您可能最终所处的位置没有带点的相邻位置,因此无法继续。如visited在这种情况下不会增加,您的循环将不会终止。

额外检查至少有一个方向未被阻塞将修复无限循环,但这不是最佳解决方案。

当更多字段被阻止时,生成随机方向然后检查该方向是否可行的实现可能需要多次尝试。 尽管不太可能,您甚至可能会获得表示长期受阻的随机数字。

为了实现当所有方向都被阻止时终止程序的要求并改善当许多方向被阻止时的行为,我建议更改算法。

建议的算法:

  • 检查所有4个方向是否可以行走,将所有可能的方向放入最多4个元素的数组中,并将可能的方向计为n 。 (例如:如果可以向上、向下和向左,则数组将包含 updownleft(invalid) 。计数将为 n = 3 。)
  • 如果 n == 0 (全部阻塞)终止循环
  • 0 中获取一个随机数至n - 1 (例如: 0 .. 2 )
  • 从数组中选择方向(例如:随机数 1 将选择 down )
  • 朝选定的方向移动(之前已经检查过可以)

关于c - 10X10 数组中的随机游走,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60986945/

相关文章:

c - 如何在 C 中进行原子增量和获取?

c - OpenSSL 和 Apple Keychain 集成

c++ - 在使用蒙特卡洛算法计算热平衡分布的程序中,C++ 似乎跳线的问题

Python for 循环只保存我的二维数组中的最后一个循环

c - 为什么这个字符数组会出现 Seg Fault

c - 不安全的 C 函数和替换

c - 帕斯卡三角返回无意义的值

python - 起始值和最小值/最大值之间的随机游走序列

c - 使用递归在 C 中的格上进行自回避随机游走 - 内存分配

python - Hadoop上的大型图处理