在C中回溯迷宫求解器

时间:2015-09-09 10:55:59

标签: c maze recursive-backtracking

我正在为迷宫编写寻找路径解决方案[30] [30] 我在路径查找功能中使用了回溯; 这是伪代码:

bool find_path(myMap,myVisited,myPath,v,h)

  1. 找到起始点[v,h],然后为该点运行find_path函数
  2. 将房间标记为已访问
  3. 终止条件1:如果h=29,则在路径上标记,然后返回true
  4. 递归部分:搜索8个邻居:西,西北,北,东北,东,东南,南,西南。 检查房间是否可以访问,然后调用find_path函数,如果返回true,则在find路径上标记。
  5. 终止条件2:返回false。
  6. 当我运行它时,它总是给出分段错误。我尝试了不同的方法,但都给出了相同的错误? 输出应该像这样的图像: 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;}
    

0 个答案:

没有答案