编写程序,生成一种贯穿10*10字符数组(初始时全为字符'.')的“随机步法”。程序必须随机地从一个元素“走到”另一个元素,每次都向上、向下、向左或向右移动一个元素位置

编写程序,生成一种贯穿10*10字符数组(初始时全为字符'.')的“随机步法”。程序必须随机地从一个元素“走到”另一个元素,每次都向上、向下、向左或向右移动一个元素位置。已访问过的元素按照访问顺序用字母A到Z进行标记。

提示:利用srand函数和rand函数产生随机数,然后查看此数除以4的余数。余数一共有4种可能的值(0、1、2、3),指示下一次移动的4中可能方向。在执行移动之前,需要检查两项内容:一是不能走到数组外面,二是不能走到已有字母标记的位置。只要有一条件不能满足,就得尝试换一个方向移动。如果4个方向都堵住了,程序就必须终止了。

要求:包含函数:void generate_random_walk(char walk[10][10]);     void print_array(char walk[10][10]);  main函数首先调用generate_random_walk,该函数把所有数组元素都初始化为字符'.',然后将其中一些字符替换为A到Z的字母。接着,main函数调用print_array函数来显示数组。

#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void generate_random_walk(char walk[10][10]);
void print_array(char walk[10][10]);
int main(void)
{
 char a[10][10];
 int i, j;
 generate_random_walk(a);
 for (i = 0; i < 10; i++)
 {
  for (j = 0; j < 10; j++)
  {
   printf("%c  ", a[i][j]);
  
  }
  printf("\n");
 }

 printf("\n");
 printf("\n");

 print_array(a);
 return 0;
}

void generate_random_walk(char walk[10][10])
{
 int i, j;
 for (i = 0; i < 10; i++)
     for (j = 0; j < 10; j++)
           walk[i][j] = '.';
}

void print_array(char walk[10][10])
{
 srand((unsigned)time(NULL));
 char walker = 'A';
 int tmp,i=0,j=0;
 walk[i][j] = walker;
 walker++;
 for (;;)
 {
  tmp = rand() % 4;
  if (tmp == 0 && walker<='Z')
  {
   if (i >= 1 && walk[i - 1][j] == '.')
   {
    walk[i - 1][j] = walker;
    walker++;
    i = i - 1;
   }
   else if (i < 9 && walk[i + 1][j] == '.')
   {
    walk[i + 1][j] = walker;
    walker++;
    i = i + 1;
   }
   else if (j > 0 && walk[i][j - 1] == '.')
   {
    walk[i][j - 1] = walker;
    walker++;
    j = j - 1;
   }
   else if (j < 9 && walk[i][j + 1] == '.')
   {
    walk[i][j + 1] = walker;
    walker++;
    j = j + 1;
   }
   else
    break;
  }
  else if (tmp == 1 && walker <= 'Z')
  {
   if (i < 9 && walk[i + 1][j] == '.')
   {
    walk[i + 1][j] = walker;
    walker++;
    i = i + 1;
   }
   else if (j > 0 && walk[i][j - 1] == '.')
   {
    walk[i][j - 1] = walker++;
    j--;
   }
   else if (j < 9 && walk[i][j + 1] == '.')
   {
    walk[i][j + 1] = walker++;
    j++;
   }
   else if (i > 0 && walk[i - 1][j] == '.')
   {
    walk[i - 1][j] = walker++;
    i--;
   }
   
   else
    break;
  }
  else if (tmp == 2 && walker <= 'Z')
  {
   if (j > 0 && walk[i][j - 1] == '.')
   {
    walk[i][j - 1] = walker;
    walker++;
    j = j - 1;
   }
   else if (j < 9 && walk[i][j + 1] == '.')
   {
    walk[i][j + 1] = walker++;
    j++;
   }
   else if (i > 0 && walk[i - 1][j] == '.')
   {
    walk[i - 1][j] = walker++;
    i--;
   }
   else if (i < 9 && walk[i + 1][j] == '.')
   {
    walk[i + 1][j] = walker++;
    i++;
   }
   else
    break;
  }
  else if (tmp == 3 && walker <= 'Z')
  {
   if (j < 9 && walk[i][j + 1] == '.')
   {
    walk[i][j + 1] = walker;
    walker++;
    j = j + 1;
   }
   else if (j > 0 && walk[i][j - 1] == '.')
   {
    walk[i][j - 1] = walker++;
    j--;
   }
   
   else if (i < 9 && walk[i + 1][j] == '.')
   {
    walk[i + 1][j] = walker++;
    i++;
   }
   else if (i > 0 && walk[i - 1][j] == '.')
   {
    walk[i - 1][j] = walker++;
    i--;
   }
   else
    break;
  }
  else
   break;
  
 }
 for (i = 0; i < 10; i++)
 {
  for (j = 0; j < 10; j++)
  {
   printf("%c  ", walk[i][j]);
  }
  printf("\n");
 } 
}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值