大一上 随机步法 笔记

题意
在这里插入图片描述
想过很多种思路,比如直接用A-Z的ASCII来做循环,再判断周围是否为点,然后继续下去,但是如果生成的随机数是让其走出范围的或撞上已有的字母的,就需要重新生成随机数直到找到路,最后无路可走结束,又需要一次进一步判断。也想过把0 1 2 3试过后都不能前进则结束程序,但是计数又不太方便。方法还是选择分块写不同判断的函数来实现这个过程。代码能力 算法 数据结构都是刚刚开始学习,很多东西了解但是运用起来非常费劲,需要不断思考和大量练习。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stdbool.h>
#define N 10

char map[N][N];
int i=0,j=0,next_i=0,next_j=0;
void nextstep(int next)//上0 右1 下2 左3
{
    switch(next)
    {
        case 0:next_i=i-1;break;
        case 1:next_j=j+1;break;
        case 2:next_i=i+1;break;
        case 3:next_j=j-1;break;
    }
}

bool checknextstep(int next_i,int next_j)//判断下一步是否符合继续的要求
{
    bool flag = false;
    if((next_i>=0&&next_i<=N-1)&&(next_j>=0&&next_j<=N-1))
    {
        if(map[next_i][next_j]=='.')
        {
            flag = true;
        }
    }
    return flag;
}

bool checkgoing(int i,int j)//判断当前这一步能不能继续走下去
{
    bool flag = false;
    if(checknextstep(i-1,j)||checknextstep(i+1,j)||checknextstep(i,j-1)||checknextstep(i,j+1))
    {
        flag = true;
    }
    return flag;
}

int main(void)
{
    bool flag = true;
    int next;
    srand((unsigned)time(NULL));
    for(i=0;i<N;i++)//初始化二维数组为点 第一个位置是'A'
    {
        for(j=0;j<N;j++)
        {
            map[i][j]={'.'};
        }
    }
    char alp='A';//便于字母往后推动的处理
    map[0][0]=alp;
    
    i=0,j=0;//上面用过了i j做循环,需要重新初始化
    while(flag)
    {
        if(checkgoing(i,j))
        {
            while(1)
            {
                next_i=i;
                next_j=j;//初始化下一步位置next_i next_j为这一步位置
                next=rand()%4;
                nextstep(next);//推出下一步i或j的改变情况
                if(checknextstep(next_i,next_j))//坐标改变后如果可以走下去
                {
			i=next_i;
                    	j=next_j;//更新了位置
                    	map[i][j]=++alp;//很巧妙地让字母往后移动
                   	break;
                }
            }
        }else{
            flag = false;
        }
        if(alp>='Z')
        {
            flag = false;
        }
    }
    
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            printf("%c ",map[i][j]);
        }
        printf("\n");//二维数组换行输出
    }
    return 0;
}

输出一种结果如下

A . . . . . . . . . 
B . . . . . . . . . 
C . . . S T . . . . 
D E F . R U . . . . 
. . G P Q V . . . . 
. . H O X W . . . . 
. . I N M . . . . . 
. . J K L . . . . . 
. . . . . . . . . . 
. . . . . . . . . .
 

ps 容易忘记第58行将i和j初始化清零

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.zwX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值