簡體   English   中英

帶 DFS 的迷宮求解器

[英]Maze solver with DFS

我正在嘗試使用 DFS 算法解決迷宮。ORDER: West- North-South-East 我的輸出在這個邏輯迷宮圖片 1中工作。 它不應該在點 (3,3) 之后上升,因為優先順序是西。 我應該怎么辦?

#include <stdio.h>

char matrix[8][8];

void File()
{
        int i,j;
  

    FILE *file1;
    file1=fopen("maze1.txt","r");
 
    for(i=0; i<8; i++){
        for(j=0;j<8;j++)
        {
        fscanf (file1, " %c", &matrix[i][j]);
        
        printf("%c ",matrix[i][j]);
       }
    printf("\n");
    }
}
void Print()
{
    int i,j;
    for(i=0;i<8;i++)
    {
        for(j=0;j<8;j++)
        {
            printf("%c ",matrix[i][j]);
            }
    printf("\n");       
    }
}
void stepDFS()
{
    int i,j;
    for(i=0;i<8;i++)
    {
        for(j=0;j<8;j++)
        {
            if(matrix[i][j] == 's')
            {
                
                    DFS(i,j);
                        
               
            
            }
            
        }
    printf("\n");       
    }
    
}
 DFS(int i,int j)
{
    if(matrix[i][j-1] == '-')
    {
        matrix[i][j-1] = '.';
        DFS(i,j-1);
    }
     if(matrix[i-1][j] == '-')
    {
        matrix[i-1][j] = '.';
        DFS(i-1,j);
    }
     if(matrix[i+1][j] == '-')
    {
        matrix[i+1][j] = '.';
        DFS(i+1,j);

    }
     if(matrix[i][j+1] == '-')
    {
        matrix[i][j+1] = '.';
       DFS(i,j+1);

    }
    
    
}
int main()
{
    File();
    Print();
    stepDFS();
    Print();
    return 0;
}

maze1.txt (#wall - null .step)

# # # # # # # #  
# g - - # - - #       
# # # - - - # # 
# - # # - - - # 
# - - # - - - #
# - - - - # # # 
# - - # - - s #
# # # # # # # #

輸出

# # # # # # # #
# g . . # . . #
# # # . . . # #
# . # # . . . #
# . . # . . . #
# . . . . # # #
# . . # . . s #
# # # # # # # #

我不知道這是否應該是輸出

# # # # # # # #  
# g . . # - - #       
# # # . . - # # 
# . # # . - - # 
# . . # . - - #
# . . . . # # # 
# - - # . . s #
# # # # # # # #

--------------更新-------------- 一步一步

#include <stdio.h>

char matrix[8][8];

void ReadFile()
{
    printf("\n\n\n                START MAZE    ");
    int x,y;
    FILE *file1;
    file1=fopen("myMaze.txt","r");
 
    for(x=0; x<8; x++){
        for(y=0;y<8;y++)
        {
        fscanf (file1, " %c", &matrix[x][y]);
        
      
       }
    printf("\n");
    }
}



void PrintMaze()
{ 
    int x,y;
    for(x=0;x<8;x++)
    {
        printf("                ");
        for(y=0;y<8;y++)
        {
             
            printf(" %c ",matrix[x][y]);
        }
     
    printf("\n");       
    }
    printf("\n\n\n\n");
}
  
  
int DFS(int x,int y){
 

 
    if(matrix[x][y]=='g') // goal
    {
        return 1;
    }
      if(matrix[x][y-1] == '-' ){ //WEST
           

        
        matrix[x][y-1] = '.';
        PrintMaze();
        
        
        if(DFS(x,y-1)){
            
            matrix[x][y-1] ='.'; 
            PrintMaze();
            
            return 1;
        }
        else{
            DFS(x,y-1);
            return 0;
        
         }
         DFS(x,y-1);
      

     }
      if(matrix[x-1][y] == '-'){  //NORTH
       
   
        matrix[x-1][y] = '.';
        PrintMaze();
        
        if(DFS(x-1,y)){
            
            matrix[x-1][y] = '.';
            PrintMaze();
            
            return 1;
        }
        else{
            DFS(x-1,y);
            return 0;
        }
     
         DFS(x-1,y);
    

     }
    
    
 
    
    
    
       if(matrix[x+1][y] == '-'){ //SOUTH
             
     
        matrix[x+1][y] = '.';
        PrintMaze();
        
        if(DFS(x+1,y)){
            
           matrix[x+1][y] ='.'; 
           PrintMaze();
            
            return 1;
            
        }
        else{
          DFS(x+1,y);
            return 0;
        }
        
        DFS(x+1,y);
 
    }  
  
    
           if(matrix[x][y+1] == '-'){     //EAST
          

        matrix[x][y+1] = '.';
       
        if(DFS(x,y+1)){
            
        matrix[x][y+1] = '.'; 
        PrintMaze();
          
            return 1;
        }
        else{
            DFS(x,y+1);
            return 0;
        }
        
        DFS(x,y+1);
    
    }
    
 

    return 0;


}


void StartSearch()
{ 
    printf("                  STEP BY STEP");

    int x,y;

 
    for(x=0;x<8;x++)
    {
        for(y=0;y<8;y++)
        {
            if(matrix[x][y] == 's')//start
            {
              DFS(x,y);
 
             }
        }
        
    printf("\n");  
         
    }
 
}
 
int main()
{
    ReadFile();
    
    PrintMaze();
    
    StartSearch();
    
    PrintMaze();
    
    return 0;
}

我的迷宮.txt

# # # # # # # #  
# g - - # - - #       
# # # - - - # # 
# - # # - - - # 
# - - # - - - #
# - - - - # # # 
# - - # - - s #
# # # # # # # #

在此處輸入圖像描述

DFS 根據函數內部的第一個 if 條件確定方向。還應考慮其他方向。

首先,啟用並注意編譯器的警告! (使用gcc ,我使用-Wall -Wextra -pedantic )。 你已經被告知了。 當編譯器可以為您回答您的問題時,為什么還要來 SO!

DFS(int i,int j)表示int DFS(int i,int j) ,但您的意思是使用void DFS(int i,int j) (不過,這不是你需要的。你已經擁有了你需要的東西。)


接下來,讓我們確定預期的輸出,因為您不確定。 這個迷宮有五個解決方案(忽略那些毫無意義地訪問一個單元兩次的解決方案)。

Length = 9
# # # # # # # #
# g . . # - - #
# # # . . - # #
# - # # . - - #
# - - # . - - #
# - - - . # # #
# - - # . . s #
# # # # # # # #

Length = 11
# # # # # # # #        # # # # # # # #
# g . . # - - #        # g . . # - - #
# # # . . - # #        # # # . . . # #
# - # # . . - #        # - # # - . - #
# - - # . . - #        # - - # . . - #
# - - - . # # #        # - - - . # # #
# - - # . . s #        # - - # . . s #
# # # # # # # #        # # # # # # # #

Length = 13
# # # # # # # #        # # # # # # # #
# g . . # - - #        # g . . # - - #
# # # . . - # #        # # # . . . # #
# - # # . . . #        # - # # - . . #
# - - # . . . #        # - - # . . . #
# - - - . # # #        # - - - . # # #
# - - # . . s #        # - - # . . s #
# # # # # # # #        # # # # # # # #

其中任何一個都是有效的輸出。 顯然,第一條路徑比其他兩條路徑短,但 DFS 不會(必然)找到最短路徑。 (為此,您需要一個 BFS。)


關於這個問題。

你有兩個問題:

  • 您正在標記您訪問過的每個單元格,無論它是否是路徑的一部分。
  • 您永遠不會停止搜索,因此您最終會訪問每個可到達的單元格。

為了解決這兩個問題,需要做出一項重要的改變。 DFS需要返回由其參數標識的單元格是否是路徑的一部分。

如果單元格是路徑的一部分, DFS應該返回1 ,否則返回0

那么你怎么知道細胞是否是路徑的一部分呢?

  • 如果當前單元格是g ,則當前單元格是路徑的一部分。
  • 如果向北的像元是路徑的一部分(即,如果DFS(y-1,x)返回真值),則當前像元是路徑的一部分。
  • 如果向南的像元是路徑的一部分(即,如果DFS(y+1,x)返回真值),則當前像元是路徑的一部分。
  • 如果向西的像元是路徑的一部分(即,如果DFS(y,x-1)返回真值),則當前像元是路徑的一部分。
  • 如果向東的像元是路徑的一部分(即,如果DFS(y,x+1)返回真值),則當前像元是路徑的一部分。
  • 否則,單元格不是路徑的一部分。

問題#2:你在找到解決方案后繼續搜索。

一旦你知道一個單元是路徑的一部分, DFS應該返回。 立即地。 如果向北的單元格是路徑的一部分,請不要繼續檢查向南的節點!


問題 #1:您正在標記您訪問過的每個單元格

當您進入DFS時,您將單元格標記為路徑的一部分. . 這很好,因為它可以防止無限循環。

但它可能最終不會成為路徑的一部分。 如前所述,您需要將其值恢復為-如果它不是路徑的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM