发现此程序中生成“随机游走”的错误

问题描述:

编写一个程序,该程序跨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)它不会将我们带到已分配字母的元素。如果违反任一条件,请尝试向另一个方向移动。如果全部四个方向都被阻止,程序必须终止。

+1

你想让我们做你的功课吗? – Loocid 2015-03-31 00:33:19

+0

这不像一个问题。这对其他用户来说更是一个挑战。此外,描述你的代码很漂亮,但也说它有时候工作可怕是有点混乱。 – Ben 2015-03-31 00:36:17

+1

发现错误?怎么样告诉我们编译器显示的错误是什么?如果它编译那么这就是你的错误,并有简单的调试技术,可以很容易地找到所述的错误。 – DigitalNinja 2015-03-31 00:39:15

我发现了主要问题。当你走进一个现有的信,你忘了备份你尝试之前再次:

 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,那么你将处于死胡同。而不是return 0在这一点上,你应该break打印阵列。

+0

是的!我完全忘了备份占用的行/列;我遵循你的打破而不是返回的建议。你是一个快速的天才,你是如何发现问题的? – user3646717 2015-03-31 01:24:59