[英]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.