我正在为迷宫 [30][30] 编写查找路径解决方案,我在路径查找功能中使用了回溯;这是伪代码:
bool find_path(myMap,myVisited,myPath,v,h)
- 找到起点然后为该点
[v,h]
运行函数find_path
- 将房间标记为已访问
- 终止条件1:如果
h=29
,在路径上标记然后返回true - 递归部分:搜索 8 个邻居:west,northwest,north,northeast,east,southeast,south,southwest。检查房间是否可访问,然后调用 find_path 函数,如果返回 true,则在查找路径上标记。
- 终止条件2:返回false。
当我运行它时,它总是给出分段错误。我尝试了不同的方法,但都给出了相同的错误?输出应该是这样的图像: http ://postimg.org/image/cd8unwet5/ 这是我的代码:
// myMap ='.' is a block on map
//myVisited ='*' room visited
bool isSafe(char myMap[30][30], char myVisited[30][30], int v,int h){
if(v>=0||v<30||h>=0||h<30||myMap[v][h]!='.'||myVisited[v][h]=='*')return true;
return false;}
//3 map
//myMap contain the maze
//myVisited use to mark room visited
//myPath is final path.
bool find_path(char myMap[30][30],char myVisited[30][30],char myPath[30][30], int v,int h){
//giving h=-1 and v=-1 , find starting point.
if(h==-1&&v==-1){
h=h+1;
for (v=0;v<30;v++){
if(myMap[v][h]!='.'&& h==0) {find_path(myMap,myVisited,myPath,v,h);}
}
}
myVisited[v][h]='*'; //mark room as visited.
if(h==29){ //stop when column is 29 and mark on path
myPath[v][h]='*';
return true;}
if(isSafe(myMap,myVisited,v,h-1)==true){ //if room is okie to access
if(find_path(myMap,myVisited,myPath,v,h-1)==true){ // there is way out
myPath[v][h]='*'; //mark on myPath
}
}
//.......same code for other room
if(isSafe(myMap,myVisited,v,h+1)==true){ //if room is okie to access
if(find_path(myMap,myVisited,myPath,v,h+1)==true){ // there is way out
myPath[v][h]='*'; //mark on myPath
}
}
if(isSafe(myMap,myVisited,v-1,h)==true){ //if room is okie to access
if(find_path(myMap,myVisited,myPath,v-1,h)==true){ // there is way out
myPath[v][h]='*'; //mark on myPath
}
}
if(isSafe(myMap,myVisited,v+1,h)==true){ //if room is okie to access
if(find_path(myMap,myVisited,myPath,v+1,h)==true){ // there is way out
myPath[v][h]='*'; //mark on myPath
}
}
if(isSafe(myMap,myVisited,v+1,h-1)==true){ //if room is okie to access
if(find_path(myMap,myVisited,myPath,v,h-1)==true){ // there is way out
myPath[v][h]='*'; //mark on myPath
}
}
if(isSafe(myMap,myVisited,v-1,h-1)==true){ //if room is okie to access
if(find_path(myMap,myVisited,myPath,v-1,h-1)==true){ // there is way out
myPath[v][h]='*'; //mark on myPath
}
}
if(isSafe(myMap,myVisited,v-1,h+1)==true){ //if room is okie to access
if(find_path(myMap,myVisited,myPath,v-1,h+1)==true){ // there is way out
myPath[v][h]='*'; //mark on myPath
}
}
myVisited[v][h]='.';
return false;//back track
return false;}