c - 找出该程序中生成 “random walk"的错误

标签 c arrays

编写一个程序,在 10 x 10 数组中生成“随机游走”。该数组将包含字符(最初都是“.”)。该程序必须从一个元素随机“游走”到另一个元素,总是向上、向下、左移或右移一个元素。程序访问的元素将按照访问的顺序用字母 A 到 Z 进行标记。以下是所需输出的示例: Image

这是我的漂亮代码,有时运行得很糟糕,有时根本不起作用:

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 10//max 127 because of signed char array
#define DIRECTIONS 4//up, down, left, right

int main(void)
{
    bool success0 = true, success1 = true, success2 = true, success3 = true;//to check if one path is available or not
    int row, column, direction;
    signed char array[SIZE][SIZE], letter;

    //seeds the random number generator
    srand((unsigned)time(NULL));

    //INITIALIZES ARRAY
    for(row = 0; row < SIZE; row++){
        for(column = 0; column < SIZE; column++){
            array[row][column] = '.';
        }
    }


    //PATH OF THE ALPHABET
    row = 0;
    column = 0;
    for(letter = 'A'; letter <= 'Z'; letter++){
        direction = rand() % DIRECTIONS;
        //Outer if checks that we are not in the boundary of the array, outer else applies the offset.
        //Inner if checks that the element is "empty", inner else makes the letter loop to be repeated.
        switch(direction){
            case 0://up
            if(row == 0){
                letter--;
                success0 = false;
            }
            else{
                row--;
                if(array[row][column] == '.'){
                    array[row][column] = letter;
                    success0 = true;
                    success1 = true;
                    success2 = true;
                    success3 = true;
                }
                else{
                    letter--;
                    success0 = false;
                }
            }
            break;

            case 1://right
            if(column == SIZE - 1){
                letter--;
                success1 = false;
            }
            else{
                column++;
                if(array[row][column] == '.'){
                    array[row][column] = letter;
                    success0 = true;
                    success1 = true;
                    success2 = true;
                    success3 = true;
                }
                else{
                    letter--;
                    success1 = false;
                }
            }
            break;

            case 2://down
            if(row == SIZE - 1){
                letter--;
                success2 = false;
            }
            else{
                row++;
                if(array[row][column] == '.'){
                    array[row][column] = letter;
                    success0 = true;
                    success1 = true;
                    success2 = true;
                    success3 = true;
                }
                else{
                    letter--;
                    success2 = false;
                }
            }
            break;

            case 3://left
            if(column == 0){
                letter--;
                success3 = false;
            }
            else{
                column--;
                if(array[row][column] == '.'){
                    array[row][column] = letter;
                    success0 = true;
                    success1 = true;
                    success2 = true;
                    success3 = true;
                }
                else{
                    letter--;
                    success3 = false;
                }
            }
            break;

            default: printf("Error"); break;
        }
        //checks if all 4 directions are blocked
        if(success0 == false && success1 == false && success2 == false && success3 == false){
            printf("All four directions are blocked: program must terminate.\n");
            return 0;
        }
    }

    //PRINTS ARRAY
    for(row = 0; row < SIZE; row++){
        for(column = 0; column < SIZE; column++){
            putchar(array[row][column]);
            putchar(' ');
        }
        putchar('\n');
    }

    return 0;
}

提示:使用 srand 和 rand 函数生成随机数。在执行移动之前,请检查 (a) 它不会超出数组,并且 (b) 它不会将我们带到已经分配了字母的元素。如果违反了任一条件,请尝试朝另一个方向移动。如果所有四个方向都被阻止,则程序必须终止。

最佳答案

我发现了主要问题。当您走进现有信件时,您忘记在重试之前进行备份:

        case 0://up
        if(row == 0){
            letter--;
            success0 = false;
        }
        else{
            row--;
            if(array[row][column] == '.'){
                array[row][column] = letter;
                success0 = true;
                success1 = true;
                success2 = true;
                success3 = true;
            }
            else{
                row++; // THIS WAS MISSING
                letter--;
                success0 = false;
            }
        }
        break;

您需要像上面那样修复每个方向。

顺便说一下,收到“所有方向被封锁”的消息似乎很正常,因为你认为已经走过的路是无法通行的。所以你很容易就会走进死胡同。例如,如果在您的图片中,如果您从 H 向上到 I,那么您将陷入死胡同。此时您应该break 来打印数组,而不是return 0

关于c - 找出该程序中生成 “random walk"的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29358623/

相关文章:

c++ - 使用 scanf_s 获取字符串值的问题

arrays - Powershell - 将 CSV 文件加载到多维数组中

c++ - 诠释 *吨;这个 t[*t] - 类型定义

iphone - 我的方法似乎总是返回 FALSE

c - 尝试从二进制文件读取数据,但未能将其放入结构中

c - 填充二叉树的每个节点中的下一个右指针

C: 使用 fscanf 读取 json 数组

C++ 将数组及其长度传递给函数(使用宏/内联函数?)

python - 更改 Array 元素时在 Python traits 包中触发事件

c - Strsep 在我的 Mac OS X x86_64 系统上返回 32 位指针