学习算法 之 DFS的入门
前言
这只是小白对自己的学习做的一些归纳总结
DFS的理解
DFS,Depth First Search,深度优先搜索,是一种暴力的算法,在我理解来,就是以一条路走到底的气势走一次,不行回到上一步继续选择其他可走路径,再不行再选,再不行再回到上一步,将所有能走的可能性都去走一遍的暴力算法,运行时最糟糕的情况下算法时间复杂度为O(!n),所以这种方法在ACM比赛时要谨慎用,很多时候都需要合理剪枝
例子
给自己举个简单的例子,dfs走迷宫找最短路径并输出路径(一般用bfs,这里是为了找个地方用)
#include <iostream>
using namespace std;
const int SIZE=20;
int t[SIZE][SIZE];
int s[SIZE][SIZE]; //输入路径
int visit[SIZE][SIZE]; //记载已走路径
//int (*visit)[SIZE]=new int [SIZE][SIZE]; //发现动态分配数组无法用memset一次初始化成功,需要多次
int row,col,a,b,min=999999; //行列与想要到的坐标
void dfs(int x,int y,int step)
{
int next[4][2]={
{0,1},
{1,0},
{0,-1},
{-1,0},
};
int tx,ty,i,j;
if(x==a&&y==b)
{
if(step<min) {min=step; //找到小的可以把visit数组记录下来
for(i=1;i<=row;i++)
{
for(j=1;j<=col;j++)
{
t[i][j]=visit[i][j];
}
}
}
return;
}
for(i=0;i<4;i++)
{
tx=x+next[i][0];
ty=y+next[i][1];
if(tx<1||ty<1||tx>row||ty>col) continue; //出界
if(s[tx][ty]==0&&visit[tx][ty]!=1)
{
visit[tx][ty]=1;
dfs(tx,ty,step+1);
visit[tx][ty]=0; //这一步很重要
}
}
}
int main()
{
int i,j;
char temp;
memset(visit,0,sizeof(visit)); //初始化数组
cin>>row>>col; //多少行多少列的迷宫
for(i=1;i<=row;i++)
{
for(j=1;j<=col;j++)
{
cin>>temp;
if(temp=='.') s[i][j]=0; //个人喜好用0代表可走,1代表障碍
else if(temp=='#') s[i][j]=1;
//else if(t=='%') s[i][j]=2; //这是无敌
}
}
cin>>a>>b; //输入需要走到坐标
visit[1][1]=1; //第一步在原地没走
dfs(1,1,0); //起始坐标
cout<<min<<endl;
for(i=1;i<=row;i++) //输出路径
{
for(j=1;j<=col;j++)
{
if(j!=1) cout<<" ";
cout<<t[i][j];
}
cout<<endl;
}
return 0;
}
总得来说就是应用递归不停地去走下一步,不行就回溯到上一步,继续找可能走的路