自称骑士的人 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 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启