2017.11.2 关于C语言程序设计现代方法第8章第9题

原题是:

编写程序,要求此程序可以产生一种贯穿10X10数组的随机步。数组包含字符。程序必须是从一个元素随机走到另一个元素,对一个元素来说这种行走始终是向上、向下、向左、向右。程序访问的元素将用从A到Z的字母进行标记,而且是按顺序的进行访问下面是希望输出的一个实例:
A . . . . . . . . .
B C D . . . . . . .
. F E . . . . . . .
H G . . . . . . . .
I . . . . . . . . .
J . . . . . . . Z .
K . . R S T U V Y .
L M P Q . . . W X .
. N O . . . . . . .
. . . . . . . . . .

注意: 不能走到数组外面,不能走到已有字母标记的位置。只要有一个条件不满足,就得尝试换一个方向移动。如果4个方向都堵住了,程序就必须终止了。 



附上我的答案。如果有问题,请指正。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define MAXX 10
#define MAXY 10

void generate_random_walk(char walk[10][10]);
void print_array(char walk[10][10]);
void process(char walk[10][10]);

int main(void)
{
    char walk[10][10];

    generate_random_walk(walk);//调用generate_random_walk函数,对数组初始化。

    srand((unsigned) time(NULL));//生成随机数的种子数。
    process(walk);//随机步的过程。

    print_array(walk);//输出随机随机步数组。

    return 0;
}

void generate_random_walk(char walk[10][10])
{
    int x,y;

    for (x = 0; x < MAXX; x++)
    {
        for (y = 0; y < MAXY; y++)
        {
            walk[x][y] = '.';
        }
    }
}//以上函数把char型数组walk中的值全部初始化为'.'。

void print_array(char walk[10][10])
{
    int x,y;

    for (x = 0; x < MAXX; x++)
    {
        for (y = 0; y < MAXY; y++)
        {
            printf("%c",walk[x][y]);
        }
        printf("\n");
    }
}//以上函数把数组输出。

void process(char walk[10][10])
{
    int x = 0,y = 0,i,n,f;//使x,y初始化为0。
    char str;

    str = 'A';
    walk[x][y] = str;//把‘A’赋给walk[0][0]。

    for (str = 'B'; str <= 'Z'; str++)
    {
        f = 0;
        //f用于控制循环。在switch中每尝试走一次,f就会加1.
        //f == 4的时候表示,上下左右都走了一遍。此时仍然不通,
        //则说明无路可走了,应该结束循坏。
        //每个字母开始走的时候都要使f = 0,以便对每个字母的走法控制,
conti:
        n = rand() % 4;//生成随机数。
        switch (n)
        {
        case 0:
            if ((y-1)>=0 && walk[x][y-1] == '.')
            //要判断有没有越界,以及下一步是不是已经走过了。
            {
                walk[x][y-1] = str;
                y = y - 1;
            }
            else
            {
                if (f == 4) break;
                else
                {
                    f += 1;
                    goto conti;
                }
            }//如果这个方向走不了,继续尝试其他方向,返回到conti处。
            //如果四个方向都不能走,break出循环,
            break;
        case 1:
            if ((y+1)<=9 && walk[x][y+1] == '.')
            {
                walk[x][y+1] = str;
                y = y + 1;
            }
            else
            {
                if (f == 4) break;
                else
                {
                    f += 1;
                    goto conti;
                }
            }
            break;
        case 2:
            if ((x-1)>=0 && walk[x-1][y] == '.')
            {
                walk[x-1][y] = str;
                x = x - 1;
            }
            else
            {
                if (f == 4) break;
                else
                {
                    f += 1;
                    goto conti;
                }
            }
            break;
        case 3:
            if ((x+1)<=9 && walk[x+1][y] == '.')
            {
                walk[x+1][y] = str;
                x = x + 1;
            }
            else
            {
                if (f == 4) break;
                else
                {
                    f += 1;
                    goto conti;
                }
            }
            break;
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值