编程题 随机步法

编写程序, 生成一种贯穿10x10字符数组 (初始时全为字符' . ') 的"随机步法". 程序必须随机的从一个元素出发, 随机的走的另一个元素. 每次都只能向上下左右中选一个方向, 走出一步. 已经走过的位置用A-Z标记. 下面是一个输出示例:

. . . . . . . . . .
J I . . . . . . . .
K H G . . . . . . .
L E F . . . . . . .
M D C . . . . . . .
N O B A . . . . . .
Q P . . . . . . . .
R Y Z . . . . . . .
S X W . . . . . . .
T U V . . . . . . .
  • 不能走出边界
  • 不能走到走过的位置
  • 最多走到Z
  • 无法继续走时应停止并输出结果

代码

#include<stdio.h>
#include<time.h>
#define T 10

void mapInit(char map[T][T]); /* 地图初始化 */
int nextStep(int posX, int posY, char map[T][T]); /* 计算下一步 */
int setStep(int *i, int *j, int n, char map[T][T]); /* 走一步 */
void printMap(char map[T][T]); /* 打印地图 */


int main(void) {
    int i, j, n;
    char map[T][T];
    mapInit(map); /* 地图初始化 */
    char ch = 'A';
    srand((unsigned)time(NULL)); /* 随机数播种 */
    i = rand() % T;
    j = rand() % T;
    while (ch != 'Z' + 1) {
        map[i][j] = ch++;
        n = nextStep(i, j, map);
        if (!setStep(&i, &j, n, map)) break;
    }
    printMap(map);
    return 0;
}

/* 地图初始化 */
void mapInit(char map[T][T]) {
    int i, j;
    for (i = 0; i < T; i++) {
        for (j = 0; j < T; j++) {
            map[i][j] = '.';
        }
    }
}

/* 计算下一步 */
int nextStep(int posX, int posY, char map[T][T]) {
    /*
        result:
            - 0: 无法移动
            - 1: 上移
            - 2: 下移
            - 3: 左移
            - 4: 右移
    */
    int result,next;
    int flags[4] = { 0 }; /* 标记下一步 */
    /*
        依次判断能否向某个方向移动
        如果不能移动, cnt计数器不变
        如果可以移动, cnt计数器加一, 且对应位置标记
            - 1: 上移
            - 2: 下移
            - 3: 左移
            - 4: 右移
        假如可以下移,右移
        flags = {2,4,0,0}
        cnt = 2
        (如果cnt为0,说明无法继续走)
        然后生成一个随机数, rand()%cnt
        假如cnt为2, 随机数范围 0-1
        然后根据随机数取出flags的一个值,返回
    */
    int cnt = 0; /* 计数器, 计算下一步能走的可能数 */

    /* 判断上移 */
    if (posX == 0 || map[posX - 1][posY] != '.') {
        /* 在第一行或上一行这个位置已经走过了 */
        flags[cnt] = 0;
    }else {
        /* 可以上移 */
        flags[cnt++] = 1;
    }

    /* 判断下移 */
    if (posX == T-1 || map[posX + 1][posY] != '.') {
        /* 在最后一行或下一行这个位置已经走过了 */
        flags[cnt] = 0;
    }else {
        /* 可以下移 */
        flags[cnt++] = 2;
    }

    /* 判断左移 */
    if (posY == 0 || map[posX][posY - 1] != '.') {
        /* 在第一列或上一列这个位置已经走过了 */
        flags[cnt] = 0;
    }else {
        /* 可以左移 */
        flags[cnt++] = 3;
    }

    /* 判断右移 */
    if (posY == T - 1 || map[posX][posY + 1] != '.') {
        /* 在最后一列或下一列这个位置已经走过了 */
        flags[cnt] = 0;
    }else {
        /* 可以右移 */
        flags[cnt++] = 4;
    }

    if (cnt == 0) {
        /* 无路可走 */
        result = 0;
    }else {
        next = rand() % cnt; /* 下一步 */
        result = flags[next];
    }

    return result;
}

/* 走一步 */
int setStep(int *i, int *j, int n, char map[T][T]) {
    /*
        变量n
            - 0: 无法移动
            - 1: 上移
            - 2: 下移
            - 3: 左移
            - 4: 右移
    */
    if (!n) return 0; /* 无法移动, 结束 */
    switch (n) {
    case 1:
        (*i)--;
        break;
    case 2:
        (*i)++;
        break;
    case 3:
        (*j)--;
        break;
    case 4:
        (*j)++;
        break;
    }
    return 1;
}

/* 打印地图 */
void printMap(char map[T][T]) {
    int i, j;
    for (i = 0; i < T; i++) {
        for (j = 0; j < T; j++) {
            if (j == T - 1) {
                printf("%c\n", map[i][j]);
            }else {
                printf("%c ", map[i][j]);
            }
        }
    }
}
最后修改:2023 年 04 月 28 日
如果觉得我的文章对你有用,请随意赞赏