自称骑士的人 2022-04-16 16:17 采纳率: 100%
浏览 75
已结题

一道练习,请帮我分析下我的写法哪里有问题

自学C。刚学到数组,前面只学了选择、循环语句一些最基础的。

遇到了一个编程题:

img

下面是我尝试的方法

#include<stdio.h>
#include<stdbool.h>
#include<time.h>
#include<stdlib.h>
int main()
{
    char maze[10][10] = { 0 };

    srand((unsigned)time(NULL));

    for (int i = 0; i < 10; i++) {
        for (int a = 0; a < 10; a++) {
            maze[i][a] = '.';
        }
    }//初始化表

    int step_type = 0;//用来记录走法
    int m = 0, n = 0; //记录轨迹
    maze[0][0] = 'A';//从左上角开始走
    bool check[4] = { false };//用来检查走法是否重复

    for (int i = 1; i < 26;) {

        do {
            step_type = rand() % 4;
        } while (check[step_type]);  //跳过无效的走法

        switch (step_type) {
        case 0:
            if ((m - 1) >= 0 && maze[m - 1][n] == '.')//向上走不超出表&&上方格子未走过 
            {
                m = m - 1;                 //向上走。
                maze[m][n] = 'A' + i;      //留下字母足迹。
                i++;
                bool check[4] = { 0 };     //清零走法检查
                break;
            }
            else {
                check[step_type] = true;   //标记此走法无效
                if ((check[0] + check[1] + check[2] + check[3]) == 4) {
                    i = 26;                //若上下左右都不可走,提前结束
                    break;
                }
                break;                     //否则再次尝试移动。
            }
        case 1:
            if ((m + 1) <=9  && maze[m + 1][n] == '.') {
                m += 1;
                maze[m][n] = 'A' + i;
                i++;
                bool check[4] = { 0 };
                break;
            }
            else {
                check[step_type] = true;
                if ((check[0] + check[1] + check[2] + check[3]) == 4) {
                    i = 26;
                    break;
                }
                break;
            }
        case 2:
            if ((n - 1) >= 0 && maze[m][n - 1] == '.') {
                n -= 1;
                maze[m][n] = 'A' + i;
                i++;
                bool check[4] = { 0 };
                break;
            }
            else {
                check[step_type] = true;
                if ((check[0] + check[1] + check[2] + check[3]) == 4) {
                    i = 26;
                    break;
                }
                break;
            }
        case 3:
            if ((n + 1) <= 9 && maze[m][n + 1] == '.') {
                n += 1;
                maze[m][n] = 'A' + i;
                i++;
                bool check[4] = { 0 };
                break;
            }
            else {
                check[step_type] = true;
                if ((check[0] + check[1] + check[2] + check[3]) == 4) {
                    i = 26;
                    break;
                }
                break;
            }
        }
    }

    for (int i = 0; i < 10; i++) {
        for (int a = 0; a < 10; a++) {
            printf("%c ", maze[i][a]);
        }
        printf("\n");
    }//打印轨迹表格

    return 0;
}

** 运行结果及报错内容**

img

很明显这个程序失败了

我想知道哪里出了问题,希望您能详细一些解答,感激不尽。

  • 写回答

2条回答 默认 最新

  • 一只蚂蝼 2022-04-16 17:40
    关注

    两个问题,第一个是你24到26行那个while循环,是多余的,因为本身0也应该是有效的方向,你加一个while导致出的值一定不为0,导致有一个方向消失了。
    第二个是你的这一句bool check[4] = { 0 };C语言只支持定义的时候能这样赋值,后续想把整个数组赋值是不能这样的,得用memset。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月24日
  • 已采纳回答 4月16日
  • 创建了问题 4月16日

悬赏问题

  • ¥15 多址通信方式的抗噪声性能和系统容量对比
  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据
  • ¥20 软件测试决策法疑问求解答