搜索模板

广搜模板

BFS在求解最短路径或者最短步数上有很多的应用。
用最多的是在走迷宫上。

int s[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
struct node
{
    int x,y;
    int step;
}cur;
void BFS()
{
    queue<node> Q;
    cur.x = sx;
    cur.y = sy;   //广搜开始位置sx,sy为全局变量
    cur.step = 0;
    Q.push(cur);
    while(!Q.empty())
    {
        node p = Q.front();
        Q.pop();
        if(满足条件)
        {
            .....
            return;
        }
        for(int i = 0; i < 4; i ++) //四个方向开始搜索
        {   node pre;
            pre =p;
            pre.x += s[i][0];
            pre.y += s[i][1];
            if(pre.x >= 0 && pre.x < n && pre.y >= 0 && pre.y < m &&!vis[pre.x][pre.y])  //判断广搜的边界和是否访问过
            {
                pre.step++;
                vis[pre.x][pre.y]=1;  //标记位
                Q.push(pre);
            }
        }
    }
}

深搜模板

void dfs(int x,int y)
{
    int i,j,xx,yy;
    num++;        //搜索的深度
    map[x][y]=1;  //标记位
    if(满足条件)
    {
        .....
        return;
    }
    else for(i=0; i<4; i++)//四个方向优先深度搜索
        {
            xx=x+f[i][0];
            yy=y+f[i][1];
            if(xx>=0&&yy>=0&&xx<5&&yy<5&&map[xx][yy]!=1)//搜索范围及是否搜过
                dfs(xx,yy);
        }
}

深搜+回溯

void dfs(int dep,int x,int y)  
{  
    int tx,ty;  
    if(满足条件)  
    {  
        。。。。
        return;  
    }  
    else  
    {  
        for(int i=1;i<=4;i++)  
        {  
            tx=dx[i]+x;  
            ty=dy[i]+y;  
            if( 边界限制 && !set[tx][ty] )   
            {  
                set[tx][ty]=true;  
                dfs(dep+1,tx,ty);  
                set[tx][ty]=false;  
            }  
        }  
    }  
}  

你可能感兴趣的:(搜索模板)