【发布时间】:2020-04-15 17:33:51
【问题描述】:
首先我要感谢所有回答这个问题的人。
问题正在编辑中
问题是这样的,我必须创建一个从 .txt 文件生成迷宫的 C 程序,在 .txt 文件中我们有行数和列数以及迷宫方案(我将附加一个文件作为参考这里)。
20 // 行数
20 // 列数
迷宫方案可以改变
XXXXXXXXXXXXXXXXXXXX
X X X X
X XXXXX XXXX XXX XXX
X X X X X
X XXXXXXXXXXXX X X X
X X X X X X
X XXX XXXXXX XXXXX X
X XXX X X X X
X XXX XXXXX
X XXX XXXXXX X
X XXX X X X X X
XXX XXX X X XXXX X X
X X X XX X X X
XXXXX XXXX X XXX
X X XXX X X
X XXXXX X XXXX XXX X
X X X X X X
X X XXXXXX X XXXXX X
X X X
XXXXXXXXXXXXXXXXXX X
X 是墙。
玩家是*并且从位置(1,1)开始,出口总是在(18,19)
代码里面有3个结构:
- Position 表示迷宫网格内的位置
- 单元格是一种结构,用于描述哪个字符出现在 网格的位置 pos。该结构使访问过的可用 布尔变量在搜索退出路径时很有用 迷宫,变量表示搜索已经 是否访问过网格的特定位置。
- 必须使用节点结构来创建链表 包含一条可行的退出迷宫的道路。
typedef struct{
int x, y;
} position;
typedef struct{
pos;
char ch;
bool visited;
} cell;
typedef struct {
position pos;
struct node *next;
} node;
这是我发现一些问题的函数。
node *search(cell *grid, position pos, position goal, int rows, int columns)
此函数必须递归搜索通往 (18,19) 中出口的可行道路,同时使用函数 bool isEmpty 来查看节点是否为空
bool isEmpty(node *list) {
if(list -> next== NULL) {
return true;
} else {
return false;
}
}
我以为这个功能可能是这样的
node *search(cell *grid, position pos, position goal, int rows, int columns){
node* new_node = (node)malloc(sizeof(node));
//if the last element equals goal position the search finishes
if (new_node->pos.x == goal.x && new_node->pos.y == goal.y ) {
return new_node;
} else {
return *search(cell *grid, position pos, position goal, int rows, int columns);
}
}
但是当我运行程序时它崩溃了。如何修复此搜索?
[编辑]
首先我不能改变结构,因为这是一个项目规范。
功能
node *search(cell *grid, position pos, position goal, int rows, int columns)
必须使用递归算法来识别通往单元格 (18,19)//出口的道路 此函数必须返回玩家 (*) 必须访问才能退出的位置的链接列表。因此,返回值(将适当地保存在 main 中)将是这个链表的头节点,这个函数使用了另外 2 个函数:
1)
bool isEmpty(node∗ list)
如果列表为空,则此函数返回 true,否则返回 false
2)
node∗ push_list (node∗ list , position pos)
这是一个经典的列表管理推送功能。它在列表的头部添加一个包含位置 pos 的新节点
下面是我制作的代码
node *search(cell *grid, position pos, position goal, int rows, int columns)
{
//base case
if(pos.x == goal.x && pos.y == goal.y)
{
//dont know how to return the position cause im in a multidimentional array
}
}
bool isEmpty(node *list)
{
if(list -> next== NULL)
{
return true;
}else{
return false;
}
}
这就是我拯救迷宫的方法
cell *read_grid(char *filename, int *rows, int *columns)
{
int i,j;
//steam file
FILE *fp;
fp = fopen("grid.txt", "r+");
fscanf(fp, "%d\n%d\n", rows, columns);
fprintf(stdout, "%d\n%d\n", *rows, *columns);
cell grid[*rows][*columns];
cell *temp = (cell*)malloc(sizeof(cell));
assert(*grid != NULL);
if(fp == NULL)
{
printf("error\n");
exit(EXIT_FAILURE);
}
for(i = 0; i < *rows; i++)
{
for(j = 0; j < *columns; j++)
{
fscanf(fp, "%c", &(grid[i][j]).ch);
grid[i][j].pos.x =i;
grid[i][j].pos.y =j;
}
fscanf(fp, "\n");
}
fclose(fp);
temp = *grid;
return temp;
}
【问题讨论】:
-
new_node->pos.x试图访问未初始化的内存 -
return *search(cell *grid, position pos, position goal, int rows, int columns);是什么意思。您正在调用该函数,而不是定义它。另外,能不能展示一下search()函数体? -
您的基本结构设置看起来有问题。根据您的描述,您的
struct node应该包含cell和next而不仅仅是pos和next。这样您就可以获得ch和visited的剩余信息。否则,当前位置与visited和ch之间没有关联。保留两个单独的列表似乎不必要地使事情复杂化。 -
@kuro 我编辑了这个问题,我希望它现在会更有用
-
@DavidC.Rankin 我编辑了这个问题,我希望它现在会更有用
标签: c recursion multidimensional-array linked-list