过去一周一直在处理此项目。 一切,但初始化/ mallocing和步功能是由我的教授事先提供给我...回溯迷宫算法在C中出现错误
目标不是创造迷宫,而是解决它。 我第一次得到它编译它似乎运行良好,并会有所通过它...然后,它会开始做一些时髦的东西,并跳过墙壁,然后在那里停止...
试图修复它和经历它。结束了它没有第一步,现在它应该。试图了解我做错了,或者为什么我不能做正确的第一步,现在 在我maze_client ... //提供,但如果需要的话
#include <stdio.h>
#include "maze.h"
int main(int argc, char **argv)
{
FILE *fp = fopen(argv[1], "r");
Maze maze = initializeMaze(fp);
findPath(maze);// first step.. It was provided to me. It basically calls step()
displayMaze(maze);
return 0;
}
步骤功能,我可以改一下...我做另一个不适合循环,我试图看看我是否也可以摆脱废话。没有工作,只是让它开始第一步,在其他地方随机...第二个文件完成尝试我阻止了每个功能......它似乎在我的if(getBottom)
声明......我可以写下我的逻辑步骤是什么我想,如果需要它做的事情......
static int step(Maze maze, int row, int column)
{
//TODO: FINISH THE BACKTRACKING ALGORITHM
int i,j;
//int st;
int successful;
//maze->maze[row][column] = st;
if(getVisit(maze, row, column) == maze->maze[maze->finishX][maze->finishY])
{
displayMaze(maze);
return 1;
}
displayMaze(maze);
getchar();
// getVisit(maze, row, column);//gets pos
for(i = -2; i <= 2; ++i)
{
for(j = -2; j <= 2; ++j)
{
//i*i != j*j dont move in diagonal
//row+i >= 0 && row + i < n, bounds checking
//col+j >= 0 && col+j < n, bounds checking
if(i*i != j*j && row+i >= 0 && column+j >= 0)
{
getVisit(maze, row, column);//Gets position
if(getCellHasTop(maze, row, column + 1) != 1)//Wall check, Zero meaning NO WALL
{
//++st;
//gets that position and sees if it is unvisited...
//need a test if it is visited.. if it has been visited before.. Set current spot as BAD_PATH
if(getVisit(maze,row,column+j) == UNVISITED)
{
setVisit(maze, row, column+1, GOOD_PATH);
successful = step(maze, row, column + 1);
}
// if(getVisit(maze, row, column+j) == GOOD_PATH)
// {
// setVisit(maze, row-i, column, BAD_PATH);
// successful = step(maze, row, column+j);
// }
if(successful)
return 1;
}
if(getCellHasLeft(maze,row - 1,column) != 1)
{
if(getVisit(maze, row-1, column) == UNVISITED)
{
setVisit(maze, row-1, column, GOOD_PATH);
successful = step(maze, row-1, column);
}
// if(getVisit(maze, row-i, column) == GOOD_PATH)
// {
//setVisit(maze, row-i, column, BAD_PATH);
// successful = step(maze, row-i, column);
// }
//++st;
if(successful)
return 1;
}
if(getCellHasRight(maze,row + 1, column) != 1)
{
if(getVisit(maze, row+1, column) == UNVISITED)
{
setVisit(maze, row+1, column, GOOD_PATH);
successful = step(maze, row+1, column);
}
// if(getVisit(maze, row+i, column) == GOOD_PATH)
// {
// setVisit(maze, row+i, column, BAD_PATH);
// successful = step(maze, row+i, column);
// }
//++st;
if(successful)
return 1;
}
if(getCellHasBottom(maze, row, column - 1) != 1)
{
if(getVisit(maze, row, column-1) == UNVISITED)
{
setVisit(maze, row, column-1, GOOD_PATH);
successful = step(maze, row, column-1);
}
// if(getVisit(maze, row, column-j) == GOOD_PATH)
// {
// setVisit(maze, row, column-j, BAD_PATH);
// successful = step(maze, row, column-j);
// }
//++st;
if(successful)
return 1;
}
//PART 2
//Do not do else if because then each one would require... That is last resort
if(getCellHasTop(maze, row, column + 1) == 0)//Wall check
{
//++st;
//a test if it is visited.. if it has been visited before.. Set current spot as BAD_PATH
if(getVisit(maze,row, column+1) == GOOD_PATH)
{
setVisit(maze, row, column, BAD_PATH);
successful = step(maze, row, column + 1);
}
if(successful)
return 1;
}
if(getCellHasLeft(maze,row - 1,column) == 0)
{
if(getVisit(maze, row-1, column) == GOOD_PATH)
{
setVisit(maze, row, column, BAD_PATH);
successful = step(maze, row-1, column);
}
//++st;
if(successful)
return 1;
}
if(getCellHasRight(maze,row + 1, column) == 0)
{
if(getVisit(maze, row+1, column) == GOOD_PATH)
{
setVisit(maze, row, column, BAD_PATH);
successful = step(maze, row+1, column);
}
//++st;
if(successful)
return 1;
}
if(getCellHasBottom(maze, row, column - 1) == 0)
{
if(getVisit(maze, row, column-1) == GOOD_PATH)
{
setVisit(maze, row, column, BAD_PATH);
successful = step(maze, row, column-1);
}
//++st;
if(successful)
return 1;
}
//Part 3
if(getCellHasRight(maze, row + 1, column) != 0 && getCellHasLeft(maze,row - 1, column) != 0)// If there is a wall at those locationsZZ
{
if(getVisit(maze,row, column+1) == BAD_PATH)
{
setVisit(maze, row, column, BAD_PATH);
successful = step(maze, row, column-1);
}
if(successful)
return 1;
}
if(getCellHasTop(maze, row, column + 1) != 0 && getCellHasBottom(maze, row, column - 1) != 0)
{
if(getVisit(maze, row-1, column) == BAD_PATH)
{
setVisit(maze, row, column, BAD_PATH);
successful = step(maze, row+1, column);
}
if(successful)
return 1;
}
if(getCellHasTop(maze, row, column +1) != 0 && getCellHasBottom(maze, row, column - 1) != 0)
{
if(getVisit(maze, row+1, column) == BAD_PATH)
{
setVisit(maze, row, column, BAD_PATH);
successful = step(maze, row-1, column);
}
if(successful)
return 1;
}
}
}
}
displayMaze(maze);
getchar();
return 0;
}
- 的功能全码:http://pastebin.com/PtAncpqS
- 头文件(提供):http://pastebin.com/zYdCFMfX
- 扫描仪(提供):http://pastebin.com/4nQdnXTP
- 扫描头:http://pastebin.com/KjpFf83R
- 第二个尝试:http://pastebin.com/8qyuqtEv
看着你的代码,你有几个问题。最明显的是从-2到+2行和列循环。为什么你会做任何循环,如果你有谓词表示一个单元格是否有顶,左,右等?如果您可以从单元中获取这些信息,则根本无需进行任何偏移计算 - 它们已经为您完成。 –
另外,我讨厌你的函数名称。真的,'getCellHasTop'?我得到的印象是你学校里有人有一个严肃的Java恋物癖。为什么不'has_wall_above()'或'has_top()'?如果你坚持要求甚至'hasTop()'?我并不是说这只是为了滥用 - 函数名称应该是不言自明的,而你的名称不是。我不知道'getVisit'是什么意思,或者'getCellHasTop'。我必须阅读代码才能找出应该立即显而易见的内容。 –
下一个:当你有一个函数是一个*谓词* - 也就是说,它存在回答一个问题 - 你不应该把它与任何东西进行比较。 **它是一个谓词!**谓词本质上是布尔型的,所以你只需在条件语句中使用它们的返回值:或者if(getCellHasTop(maze,row,col)){'或'if(!getCellHasTop(maze,行,列)){' –