[英]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.