BFS+DFS 模板

1+1 模板:

<span style="font-size:14px;">BFS(广搜):
//bfs用队列来实现 一般都结合结构体使用 
#include<cstdio>  
#include<cstring>  
#include<queue>  
#include<algorithm>  
using namespace std;  

const int MAXN=100;  
bool vis[MAXN][MAXN]; // 访问标记  
int dir[4][2]={0,1,0,-1,1,0,-1,0}; // 方向向量  
  
struct State // BFS 队列中的状态数据结构  
{  
    int x,y; // 坐标位置  
    int step; // 搜索步数统计器  
};  
State a[MAXN];  
  
bool CheckState(State s) //约束条件检验   这个判断也可以在自定义bfs函数里体现,不一定非要自定义这个 
{  
    if(!vis[s.x][s.y] && ...) // 满足条件         
        return 1;  
    else // 约束条件冲突  
    return 0;  
}  
  
void bfs(State st)  
{  
    queue <State> q; // BFS 队列  
    State now,next; // 定义2 个状态,当前和下一个  
    st.step=0; // 计数器清零  
    q.push(st); // 入队     
    vis[st.x][st.y]=1; // 访问标记  
    while(!q.empty())  //判断队列是否为空 
    {  
        now=q.front(); // 取队首元素进行扩展  
		q.pop(); // 队首元素出队(队首元素已经赋值给了now) 
        if(now==G) // 出现目标态,此时为step 的最小值,可以退出即可  
        {  
            ...... // 做相关处理  
            return;  
        }  
    	for(int i=0;i<4;i++)  
    	{  
       		next.x=now.x+dir[i][0]; // 按照规则生成   下一个状态  
        	next.y=now.y+dir[i][1];  
        	next.step=now.step+1; // 计数器加1  
      		if(CheckState(next)) // 如果状态满足约束条件则入队  
    	    {  
        	    q.push(next);  //将next压入队列  继续搜 
       		    vis[next.x][next.y]=1; //访问标记  
      		}  
   		}  
    }  
 	return;  
}  
  
int main()  
{  
......  
 return 0;  
}</span>


<span style="font-size:14px;">DFS(深搜):  
//dfs用递归来实现 
/* 
该DFS 框架以2D 坐标范围为例,来体现DFS 算法的实现思想。 
*/  
#include<cstdio>  
#include<cstring>  
#include<cstdlib>  
using namespace std; 
 
const int MAXN=100;  
bool vis[MAXN][MAXN]; // 访问标记  
int map[MAXN][MAXN]; // 坐标范围  
int dir[4][2]={0,1,0,-1,1,0,-1,0}; // 方向向量,(x,y)周围的四个方向  

bool CheckEdge(int x,int y) // 边界条件  和  约束条件的判断  
{  
    if(!vis[x][y] && ...) // 满足条件  
        return 1;  
    else // 与约束条件冲突  
        return 0;  
}

void dfs(int x,int y)  
{  
    vis[x][y]=1; // 标记该节点被访问过  
    if(map[x][y]==G) // 出现目标态G  
        {  
        ...... // 做相应处理  
        return;  
        }  
    for(int i=0;i<4;i++)  
    {  
    	int ex=x+dir[i][0];
    	int ey=y+dir[i][1];
        if(CheckEdge(ex,ey)) // 按照规则生成下一个节点 
			//vis[ex][ey]=1;  //标记 说明已经访问过 
            dfs(ex,ey);  //递归 继续搜 
    }  
    return; // 没有下层搜索节点,回溯  
}  

//主函数 
int main()  
{  
......  
return 0;  
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值