【问题描述】
编写程序,生成一种贯穿10*10字符数组的随机步法。字符数组初始化为全 '.'。程序随机地从一个元素“走到”另一个元素,每次可以向左、向右、向上、向下移动一个元素位置,不可越出边界。已访问过的元素按字母顺序标记为A到Z,不可再次走入。到达Z为一次成功行走。若4个方向都被堵住,则行走失败。输入初始位置,输出一次行走结果。
方向规定:0为上,1为右,2为下,3为左。即顺时针。
4个方向的尝试准则:如果随机到的方向不能走,则从该方向开始按顺时针一一尝试。例如,某一步随机到了方向 2,经检验 2 方向行不通,则尝试方向 3 ;如果方向 3 也行不通,则尝试方向 0 ( (3+1) % 4);如果方向 0 还是行不通,则尝试方向 1;如果 1 也行不通,4个方向都行不通,就认定行走失败,整个行走过程结束。
注意:如果行走失败,那么就退出行走,仍然要输出行走结果。
【输入形式】两个数x, y ,两个数之间用空格隔开,分别代表初始位置的行和列。0<=x,y<=9
【输出形式】输出10*10的方阵。输出的每个字符用空格隔开,每行末尾有空格。
【样例输入1】0 0
【样例输出1】
A . . . . . O P Q R
B C F G H I N M . S
. D E . . J K L . T
. . . . . . . . . U
. . . . . . . X W V
. . . . . . . Y Z .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
【样例说明】由于编译器的不同,导致rand的随机结果不一样。所以平台的输出和同学们在本机上的输出是不同的,因此不要纠结于和样例不一样。本样例是在dev c++下的输出,如果您使用了其他 IDE,可能会有完全不一样的输出。
分析:使用stdlib.h中的rand()函数来生成随机数,例如:rand()%4 输出 0~3的随机数。为方便助教检查,要求以输入初始位置为随机种子。例如:输入初始位置为x行y列,则设置随机种子为 x+10*y,通过开始前调用 srand(x+10*y) 来完成。之后就不要再调用 srand 函数了。
例如:
int x = 0, y= 0, i;
srand(x + 10 * y);
for (i = 0; i < 26; i++) {
int dir = rand() % 4;
printf("%d\n", dir);
}
另外,上下左右行走也就是横纵坐标加减1。
代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void ranwalk (char walk[10][10]);
void array (char walk[10][10]);//打印结果
int main()
{
char a[10][10];
ranwalk(a);
array(a);
}
void ranwalk (char walk[10][10])
{
int x, y, seed;
int i, j, k;
scanf ("%d%d", &x, &y);
seed = x + 10 * y;
static int dir, m;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
walk[i][j] = '.';
}
}
srand(seed);
walk[x][y] = 'A';
for (m = 66; m < 91; m++)
{
dir = rand() % 4;
for ( k = 0; k <= 3;)
{
i = x, j = y;
switch(dir)
{
case 0 :
if(x != 0)
x = x - 1;
break;
case 1 :
if (y != 9)
y = y + 1;
break;
case 2 :
if (x != 9)
x = x + 1;
break;
case 3 :
if (y != 0)
y = y - 1;
break;
}
if (walk[x][y] == '.')
{
walk[x][y] = m;
break;
}
else
{
dir = (dir + 1) % 4;
x = i; y = j;
}
k++;
}
if (k == 4)
break;
}
}
void array(char walk[10][10]){
int i, j;
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
printf("%c ", walk[i][j]);
}
printf("\n");
}
}