# DFS 假設有一個地圖M*N這麼大(M跟N是題目會給,陣列不能這樣設) ```cpp= int map[M][N]={0}; ``` 假設題目問你從地圖的(1,1)到(i,j)有幾條路可以走 首先先呼叫一個funtion然後把起始點傳進去 ```cpp= #include <stdio.h> int i,j,M,N; int ans=0; int funtion(int ,x,int y){ } int main(){ scanf("%d %d %d %d",&M,&N,&i,&j); funtion(1,1); } ``` funtion裡面是要遞迴上下左右能走的位置 就是把能走的都過一遍 (要檢查邊界) ```cpp= int funtion(int x,int y){ if(x<=0||y<=0||x>M||y>n) return 0; funtion(x+1,y); funtion(x-1,y); funtion(x,y+1); funtion(x,y-1); return 0; } ``` 但因為走過的路就不能再走了所以要設一個used陣列記錄哪格已經走過了 ```cpp= int used[M][N]={0}; ``` fumtion: ```cpp= int funtion(int x,int y){ if(x<=0||y<=0||x>M||y>N) return 0; if(used[x][y]==1) return 0;//如果這格已經用過了就return 0,不繼續遞迴 used[x][y]=1; funtion(x+1,y); funtion(x-1,y); funtion(x,y+1); funtion(x,y-1); return 0; } ``` 最後就剩判斷是否已經走到終點了 ```cpp= int funtion(int x,int y){ if(x<=0||y<=0||x>M||y>N||used[x][y]==1) return 0; if(x==i&&y==j){ ans++;//找到一種走法,把答案+1 return 0;//結束遞迴 } used[x][y]=1; funtion(x+1,y); funtion(x-1,y); funtion(x,y+1); funtion(x,y-1); return 0; } ``` 最後要在return之前把used設回0 ```cpp= int funtion(int x,int y){ if(x<=0||y<=0||x>M||y>N) return 0; if(used[x][y]==1) return 0; if(x==i&&y==j){ ans++; return 0; } used[x][y]=1; funtion(x+1,y); funtion(x-1,y); funtion(x,y+1); funtion(x,y-1); used[x][y]=0; return 0; } ``` 完正程式碼: ```cpp= #include <stdio.h> int i,j,M,N; int ans=0; int used[100][100]={0}; int funtion(int x,int y){ if(x<=0||y<=0||x>M||y>N||used[x][y]==1) return 0; if(x==i&&y==j){ ans++; return 0; } used[x][y]=1; funtion(x+1,y); funtion(x-1,y); funtion(x,y+1); funtion(x,y-1); used[x][y]=0; return 0; } int main(){ scanf("%d %d %d %d",&M,&N,&i,&j); funtion(1,1); printf("%d\n",ans); return 0; } ``` 題目我隨便舉的啦,概念大概是這樣,dfs的題目真的超難找,大部分都bfs e431: ```cpp= #include <stdio.h> #include <string.h> int n,m; int used[10][10]; int ans; int dfs(int x,int y,int cnt){ if(x>=n||x<0||y>=m||y<0||used[x][y]==1) return 0; if(cnt==n*m){ ans++; return 0; } used[x][y]=1; dfs(x+1,y,cnt+1); dfs(x-1,y,cnt+1); dfs(x,y+1,cnt+1); dfs(x,y-1,cnt+1); used[x][y]=0; return 0; } int main(){ while(EOF!=scanf("%d %d",&n,&m)){ ans=0; for(int i=0;i<n;i++){ for(int k=0;k<m;k++){ memset(used,0,sizeof(used)); dfs(i,k,1); } } printf("%d\n",ans/2); } return 0; } ```