随机步法(C99标准中二维数组的初始化)

本博客,阅读书籍:《c语言程序设计————现代方法》

知识点:

  • C99标准中二维数组的初始化方法。
  • rand()和srand()的使用。

1 二维数组的初始化
详细介绍参考:《c语言程序设计————现代方法》
文章介绍参考:数组初始化
我简单介绍下:

int a[8]={0,0,2,0,3,0,0,8};//常规初始化
int a[8]={[2]=2,[4]=3,[7]=8};//C99初始化和上面等价
int a[2][2]={[0][0]=1,[1][1]=1]}//二维的单位矩阵

2 rand()和srand()的使用
文章介绍参考:rand和srand

3 程序实战
3.1 《c语言程序设计————现代方法》第八章 课后习题 9
编写程序,生成一种贯穿10*10字符数组(初始时全为‘.’)的“随机步法”。
程序必须随机地从一个元素“走到”另一个元素,每次都向上,向下,向左,或向右移动一个元素位置。
已访问过的元素按访问顺序用字母A到Z进行标记。
下面是输出示例:
在这里插入图片描述
3.2 程序提示:

  • 不能走到数组的外面。
  • 不能走到已有字母的位置。

3.3 程序:

/*****************************************
 《c语言————现代方法》 第八章 课后题9
 作者:dacao
 时间:2019/6/7
 注:今天端午,可惜回不去。
 ****************************************/

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stdbool.h>

#define N 10
int i=0,j=0,tmp_i=0,tmp_j=0;
char maze[N][N] = {[0 ... N-1][0 ...N-1] = '.'};  //C99中二位数组的初始化

void nextStep(int dirt)  //下一步:tmp_i,tmp_j
{
    switch (dirt)
        {
        case 0:
            tmp_i=i-1;
            break;
        case 1:
            tmp_j=j+1;
            break;
        case 2:
            tmp_i=i+1;
            break;
        case 3:
            tmp_j=j-1;
            break;
        }
}

bool checkStep(int tmp_i,int tmp_j)  //检查下一步是否合法
{
    bool flag=false;
    if((tmp_i>=0&&tmp_i<=N-1)&&(tmp_j>=0&&tmp_j<=N-1))  //下一步在矩阵范围内。
    {
        if (maze[tmp_i][tmp_j]=='.')  //下一步没有走过
        {
            flag=true;
        }
        
    }   
    return flag;
}

bool checkLive(int i,int j)  //检查当前位置是否为还有活路
{
    bool flag=false;
    if (checkStep(i-1,j)||checkStep(i+1,j)||checkStep(i,j-1)||checkStep(i,j+1)) //周围如果有一条通路,则可走
        flag=true;
    return flag;
}

int main(void)
{
    
    //for(int i=0;i<N;i++)
    //    for(int j=0;j<N;j++)
    //        maze[i][j]='.';
    //maze[10][10] = {[0 ... 9][0 ...9] = '.'};

    srand((unsigned)time(NULL));

    char alpha='A';
    maze[i][j]=alpha;  //i=j=0
    bool flag=true;
    int dirt;  //方向 0,1,2,3 ;上,右,下,左;

    while (flag)
    {
        if(checkLive(i,j))
        {
            while(1)  //有活路的希望,拼尽全力找路
            {
                tmp_i=i;
                tmp_j=j;  //这个一定要初始化的,是的每次下一步在(i,j)的周围。否则,可能向对角线移动。
                dirt=rand()%4;  //方向
                nextStep(dirt);  //临时的下一步
                if(checkStep(tmp_i,tmp_j)) //如果下一步可以走
                {
                    i=tmp_i;
                    j=tmp_j;
                    maze[i][j]=++alpha;
                    break;  //恭喜,满血复活,进入下一步
                }
            }
        }
        else
        {
            flag=false;  //没有活路,游戏终止
        }
        if(alpha>='Z')  //通关,使命完成  ++alpha,到达Z,说明Z已经赋值过给数组
            flag=false;
    }

    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N;j++)
            printf("%2c",maze[i][j]);
        printf("\n");
    }       
      
    return 0;
}

3.4程序结果
在这里插入图片描述
在这里插入图片描述

3.5 程序评价
程序存储结构不错,程序结构清晰。nice。
如果,你写出或者看见更好的程序,欢迎留言。

发布了104 篇原创文章 · 获赞 134 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/sinat_38816924/article/details/91128108