DFS入门
DFS
DFS,即深度优先搜索,是最重要的搜索思想之一,其核心在于解决当下问题,而下一步的做法和当前一样。其基本模型如下:
1 2 3 4 5 6 7 8 9 10
| void dfs(int step) { 判断边界 for(int i=;i<=n;i++) { dfs(step+1); } return ; }
|
dfs之数的全排列
题目大意
给定一个正整数n(n<10),写出1~n的全排列
解题思路
利用dfs基本模型来逐步解决
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <cstdio> int a[10]={0},book[10]={0},n; void dfs(int step) { if(step>=n+1) { for(int i=1;i<=n;i++) printf("%d",a[i]); printf("\n"); return ; } for(int i=1;i<=n;i++) { if(book[i]==0) { a[m]=i; book[i]=1; dfs(step+1); book[i]=0; } } return ; } int main() { scanf("%d",&n); dfs(1); return 0; }
|
dfs之迷宫搜索
题目大意
给定一个n行m列迷宫,要求从寻找从起点到终点的最短路径
解题思路
直接使用dfs搜索找出最短路径
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include<cstdio> int startX,startY,endX,endY,min=99999; int a[51][51]={0},book[51][51]=0; void dfs(int x,int y,int step) { if(x==endX&&y==endY) { if(step<min) min=step; return; } int next[4][2]={ {1,0},{0,1},{-1,0},{0,-1} } int tx,ty; for(int i=0;i<=3;i++) { tx=x+next[i][0]; ty=y+next[i][1]; if(tx<1||ty<1||tx>n||ty>m) continue; if(a[tx][ty]==0&&book[tx][ty]==0) { book[tx][ty]=1; dfs(tx,ty,step+1); book[tx][ty]=0; } } return ; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); scanf("%d%d%d%d",&startX,&startY,&endX,&endY); book[startX][startY]=1; dfs(startX,startY,0); printf("%s%d","最少步数为:",min); return 0; }
|