繁体   English   中英

我需要用C编写一个程序来递归地解决X和空白的迷宫

[英]I need to write a program in C that will recursively solve a maze of X's and blank spaces

程序必须从索引[0] [1]开始并在到达索引[7] [7]时完成迷宫。 程序到达“ FindPath”功能时崩溃。 我想不出我在做什么错,任何信息都可以帮助您。

#include "Header.h"

int main(void) {

int x = 0, y = 1;

char maze[8][8] = {
{' ', ' ', 'x', 'x', 'x', 'x', 'x', 'x'},
{' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x'},
{' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x'},
{' ', ' ', ' ', ' ', ' ', 'x', 'x', 'x'},
{'x', 'x', 'x', 'x', ' ', 'x', 'x', 'x'},
{'x', 'x', 'x', 'x', ' ', ' ', ' ', ' '},
{'x', 'x', 'x', 'x', 'x', 'x', 'x', ' '},
{'x', 'x', 'x', 'x', 'x', 'x', 'x', ' '},
};

for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
        printf("%c ",maze[i][j]);
    }
        printf("\n");
}


FindPath(maze, x, y);

return 0;
}


#include "Header.h"

void FindPath(char maze[8][8], int x, int y) {

if (x == 7 & y == 7) {
    printf("Maze complete");

    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            printf("%c ", maze[i][j]);
        }
        printf("\n");
    }
        return;
}
else {

    if (maze[x + 1][y] = ' ') {
        maze[x][y] = 'h';
        FindPath(maze, x + 1, y);
        return;
    }
    else if (maze[x - 1][y] = ' ') {
        maze[x][y] = 'h';
        FindPath(maze, x - 1, y);
        return;
    }
    else if (maze[x][y + 1] = ' ') {
        maze[x][y] = 'h';
        FindPath(maze, x, y + 1);
        return;
    }
    else if (maze[x][y - 1] = ' ') {
        maze[x][y] = 'h';
        FindPath(maze, x, y - 1);
        return;
    }
    else {
        printf("no path found");
        return;
    }
}
}

我相信这个问题比您要解决的要简单。

方法的主要问题: FindPath()需要在反复试验的基础上工作-您没有任何策略可以使它成功和/或失败并向调用者发出信号,也不能撤消它的错误假设。

您的代码存在问题:人们已经提到过= vs. ==但是在表示&&时也使用& 您的代码缩进或SO代码发布需要工作; 您应该努力避免代码中出现数字,以便以后可以换掉迷宫; 您的较低级别例程应返回结果,而不是打印-您较高级别的例程应获取这些结果并决定要打印的内容; 大量冗余代码-将重复的语句上移一个级别; 正如其他人所提到的,您需要进行极限检查,因为如果x为零,像maze[x - 1][y]这样的表达式会占用您没有分配的内存。

以下是根据上面的代码对代码进行的重做,并进行了一些样式更改。 它解决了您提供的一种迷宫:

#include <stdio.h>
#include <stdbool.h>

#define WIDTH (8)
#define HEIGHT (8)

void printMaze(char maze[WIDTH][HEIGHT]) {

    for (int i = 0; i < WIDTH; i++) {
            for (int j = 0; j < HEIGHT; j++) {
                    printf("%c ", maze[i][j]);
        }
        putchar('\n');
    }
}

bool findPath(char maze[WIDTH][HEIGHT], int x, int y) {

    maze[x][y] = 'h';

    if (x == WIDTH - 1 && y == HEIGHT - 1) {
        return true;
    }

    if (x + 1 < WIDTH && maze[x + 1][y] == ' ') {
        if (findPath(maze, x + 1, y)) {
            return true;
        }
    }

    if (x - 1 >= 0 && maze[x - 1][y] == ' ') {
        if (findPath(maze, x - 1, y)) {
            return true;
        }
    }

    if (y + 1 < HEIGHT && maze[x][y + 1] == ' ') {
        if (findPath(maze, x, y + 1)) {
            return true;
        }
    }

    if (y - 1 >= 0 && maze[x][y - 1] == ' ') {
        if (findPath(maze, x, y - 1)) {
            return true;
        }
    }

    maze[x][y] = ' ';

    return false;
}

int main(void) {

    char maze[WIDTH][HEIGHT] = {
        {' ', ' ', 'x', 'x', 'x', 'x', 'x', 'x'},
        {' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x'},
        {' ', 'x', 'x', 'x', 'x', 'x', 'x', 'x'},
        {' ', ' ', ' ', ' ', ' ', 'x', 'x', 'x'},
        {'x', 'x', 'x', 'x', ' ', 'x', 'x', 'x'},
        {'x', 'x', 'x', 'x', ' ', ' ', ' ', ' '},
        {'x', 'x', 'x', 'x', 'x', 'x', 'x', ' '},
        {'x', 'x', 'x', 'x', 'x', 'x', 'x', ' '},
    };

    printMaze(maze);

    if (findPath(maze, 0, 1)) {
        printf("Maze completed!\n");
        printMaze(maze);
    } else {
        printf("No path found!");
    }

    return 0;
}

输出值

> ./a.out
    x x x x x x 
  x x x x x x x 
  x x x x x x x 
          x x x 
x x x x   x x x 
x x x x         
x x x x x x x   
x x x x x x x   
Maze completed!
h h x x x x x x 
h x x x x x x x 
h x x x x x x x 
h h h h h x x x 
x x x x h x x x 
x x x x h h h h 
x x x x x x x h 
x x x x x x x h 
> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM