深搜的学习

学习算法 之 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;
}



总得来说就是应用递归不停地去走下一步,不行就回溯到上一步,继续找可能走的路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值