编写一个程序,在10 x 10数组中生成“随机游走”。数组将包含字符(最初都是'。'。程序必须从元素到元素随机“行走”,总是向上,向下一个元素,左边或右边。程序访问的元素将按照访问的顺序用字母A到Z标记。这是所需输出的一个例子:
这是我漂亮的代码,有时会很糟糕,有时根本不起作用:
#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)它不会将我们带到已经分配了字母的元素。如果违反任一条件,请尝试向另一个方向移动。如果所有四个方向都被阻止,程序必须终止。
答案 0 :(得分:2)
我发现了主要问题。当您走进现有的信件时,在再次尝试之前忘了备份:
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
,那么您将处于死路。 <$ 1}}而不是return 0
,你应该break
来打印数组。