dfs深度優先搜尋解決迷宮類問題(遍歷)

Rowon1發表於2020-12-05

dfs解決迷宮問題(dfs的入門應用)

下面是對應程式碼:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int min=9999999;					
int c[4][2]={{1,0},{0,1},{-1,0},{0,-1}};	//這裡是定義的四個方向,上下左右
int n;
int s[1000][1000];		//一個足夠容納迷宮的二維陣列
void dfs(int x,int y,int step)		//dfs接受座標和當前步數	
{
    int i,xn,yn;
    if(x==n-1&&y==n-1)				//一定要把結束條件放在前面,先判斷是否結束
    {								//這裡判斷是否到達終點
        if(step<min)				//判斷步數是否小於當前最小步數
            min=step;
        return;
    }
    for(i=0; i<4; i++)		//因為有四個方向可以走,所以這裡迴圈4次,四種情況
    {
        xn=x+c[i][0];	//這裡一定要把走過之後的x,y給一個新的變數(比如這裡的xnyn)		
        yn=y+c[i][1];	//因為要以原來的位置為中心向上下左右分別測試走,所以原來的位置不能改變。
        if(xn<0||xn>=n||yn<0||yn>=n)	//判斷是否出界
        {
            continue;					//如果出界,跳過這一步,進入下一步
        }
        if(s[xn][yn]==0)			//判斷是否是能走的路
        {
            s[xn][yn]=1;				//如果能走,把上一步標記為牆以防重複	
            dfs(xn,yn,step+1);			//進入下一步	
            s[xn][yn]=0;			//回溯,回來的時候把之前走過的還變成路
        }
    }
    return;
}
int main()
{
    int i,j;
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            scanf("%d",&s[i][j]);
        }
    }
    dfs(0,0,0);
    printf("%d",min);					//輸出最小步數
}

相關文章