大一C语言总结贴(持更) Part 10 随机步法

【问题描述】

编写程序,生成一种贯穿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");
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值