acm 第二天:搜索

广度搜索与深度搜索

图的记录:

  • 邻接表
  • 邻接矩阵

BFS
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

DFS
在这里插入图片描述
在这里插入图片描述

char board[10][15];
int k,n;
bool vis[10]={};
int f(int r,int m) {//当前已经搜索到第r行,还应再放m个棋子
	if(m<=0) return 1;
	if(r==n) return 0;
	int res=f(r+1,m);
	for(int i=0; i<n; i++)
		if(!vis[i]&&board[r][i]=='#') {
			vis[i]=true;
			res+=f(r+1,m-1);
			vis[i]=false;
		}
	return res;
}

在这里插入图片描述

精髓:DFS

    int next[8][2]= {{-2,-1},
                    {-2,1},
                    {-1,-2},
                    {-1,2},
                    {1,-2},
                    {1,2},
                    {2,-1},
                    {2,1}};          //八个方向,有顺序要求

    if(cot==p*q)                     //边界条件
    {
        win=1;
        return;
    }
    for(int i=0;i<=7;i++)
    {
        int tx=next[i][0]+x;          //上表起作用了,枚举下一步
        int ty=next[i][1]+y;
        if(tx<1||tx>p||ty<1||ty>q)    //越界返回
            continue;
        if(flag[tx][ty]==0&&!win)
        {
            flag[tx][ty]=1;            //标记该步已经走了
            dfs(tx,ty,cot+1);          //深入下一步
            flag[tx][ty]=0;            //来到这里说明上一步失败了,取消该步访问,即回溯
        }
    }

精髓:BFS

struct node
{
    int x, step;
};
queue<node> Q;
while(!Q.empty())
{
    node tmp;
    tmp=Q.front();
    Q.pop();
    x=tmp.x;
    stp=tmp.step;

}
if((!vis[tep])&&(tep!=x)&&(prime[tep]))
Q.push(temp);

猜你喜欢

转载自blog.csdn.net/weixin_42748371/article/details/86470237
今日推荐