C语言随机步法设计——C语言程序设计现代方法练习习题

C语言——随机步法设计——C语言程序设计现代方法习题

编写程序,生成一种贯穿10*10字符数组(初始时全为‘.’)的“随机步法”。程序必须随机地从一个元素“走到”另一个元素,每次都向上,向下,向左,或向右移动一个元素位置。已访问过的元素按访问顺序用字母A到Z进行标记。下面是输出示例:在这里插入图片描述
下面为代码示例:

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

#define NUM_ROW 10
#define NUM_COL 10

int judge_walk[NUM_ROW][NUM_COL]={0};     // 初始化判断数组为假(0);             
int num=0;

void generate_random_walk(char walk[NUM_ROW][NUM_COL]);
void print_walk(char walk[NUM_ROW][NUM_COL]);
int way(int row, int col);


int main(void)
{
    char walk[NUM_ROW][NUM_COL];

    srand(time(NULL));

    generate_random_walk(walk);         

    return 0;
}

void generate_random_walk(char walk[NUM_ROW][NUM_COL])          // 生成随机步法;
{
    int row, col, direction;
    char ch='A';

    for (row=0;row<NUM_ROW;row++)
        for (col=0;col<NUM_COL;col++)
            walk[row][col]='.';

    row=rand()%NUM_ROW;             // 随机初始位置;
    col=rand()%NUM_COL;             

    walk[row][col]=ch++;            
    judge_walk[row][col]=1;         // 初始位置;
    num++;                          

    while (ch<='Z')
    {
        if (way(row, col))
        {
            printf("-- No way out!!! --\n");        // 判断是否有路径,无则终止程序;
            exit(0);
        }

        direction=rand()%4;

        switch(direction)
        {
            case 0:
                if (col<NUM_ROW-1)                  // 越界判断;
                    if (!judge_walk[row][col+1])    // 路径存在判断;
                    {
                        walk[row][++col]=ch++;
                        judge_walk[row][col]=1;
                        num++;
                    }
                    break;
            case 1: 
                if (row<NUM_ROW-1)
                    if (!judge_walk[row+1][col])
                    {
                        walk[++row][col]=ch++;
                        judge_walk[row][col]=1;
                        num++;
                    }
                    break;
            case 2: 
                if (col>0)
                    if (!judge_walk[row][col-1])
                    {
                        walk[row][--col]=ch++;
                        judge_walk[row][col]=1;
                        num++;
                    }
                    break;
            case 3:
                if (row>0)
                    if (!judge_walk[row-1][col])
                    {
                        walk[--row][col]=ch++;
                        judge_walk[row][col]=1;
                        num++;
                    }
                    break;
        }
        print_walk(walk);           // 输出步法; 
    }
}

int way(int row, int col)           // 判断路径函数;
{
    if (col<9)                      // 越界判断;
        if (!judge_walk[row][col+1])
            return 0;
    if (row<9)
        if (!judge_walk[row+1][col])
            return 0;
    if (col>0)
        if (!judge_walk[row][col-1])
            return 0;
    if (row>0)
        if (!judge_walk[row-1][col])
            return 0;

    return 1;
}

void print_walk(char walk[NUM_ROW][NUM_COL])            // 输出函数;
{
    int row, col;

    system("cls");

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

    for (row=0;row<NUM_ROW;row++)
    {
        printf("\t\t\t\t\t");                           // 居中显示;
        for (col=0;col<NUM_COL;col++)
        {
            printf(" %c ", walk[row][col]);             // 数组间距;
        }

        printf("\n");
    }
    printf("\n\t\t\t\t\t%d\n", num);                    // 到达num个字符;
}

学习C语言之路不易,希望大家互相交流,都有所收获!
参考文章:C语言随机步法——注视着

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值