搜索图——dfs bfs

在一个图内进行一系列操作时的优先考虑算法
模板及变形:

DFS

dfs_first

/**first**/
void dfs(参数)
{//适用于 规律性搜索
	if (函数终止条件)
		return;
	if (参数边界判断)
		return;
	for (扩展方式)
	{
		参数扩展变化
		if (参数合理判断)
		{
			标记
			变化

			dfs(变化后参数);

			取消标记
			取消变化
		}
	}
}

/************eg:************/
void dfs(int x, int n, int k)
{//利用x——n的数构成k位排列 全排列
	if (x == k + 1)
	{
		for (int i = 1; i <= k; i++)
			cout << p[i] << " ";
		cout << endl;
		return;
	}
	if (x>n)
		return;
	for (int i = 1; i <= n; i++)
	{
		if (vis[i] == false && i > p[x-1])
		{
			p[x] = i;
			vis[i] = true;//标记

			dfs(x + 1,n,k);
			vis[i] = false;//取消标记
		}
	}
}
void dfs(int index,int n,int k)
{//通过对数组的n个数据罗列(这里是求和),来判断其值是否符合
	if (index == k + 1)
	{
		if (isprime(sum))//判素
			ans++;//计数
		/**Test**/
		/*
		for (int i = 1; i <= index - 1; i++)
			cout << p[i] << " ";
		cout << endl;
		*/
		return;
	}
	for (int i = 1; i <= n; i++)
	{
		if (vis[i] == false && i > p[index - 1])
		{
			p[index] = i;
			vis[i] = true;//标记
			sum += a[i];//变化
			
			dfs(index + 1, n , k );
			
			vis[i] = false;//取消标记
			sum -= a[i];//取消变化
		}
	}
}

dfs_second

/**second**/
bool dfs(参数)
{//适用于道路的搜索
	标记
	if (函数终止条件)
		return true;
	if (参数边界判断)
		return false;
	for (扩展方式)
	{
		if (参数合理判断)
		{
			注入
			if (dfs(变化参数))
				return true;
			取消注入
		}
	}
}
/************eg:************/
bool dfs(int i,int j) 
{//数独九宫格
    //自带标记
    if (i==9&&j==0)
     	return true; 	
    if (i<0||i>8||j<0||j>8)
    	return false;
    if (Sudoku[i][j] != 0)
     	return dfs(i + (j == 8), (j + 1) % 9);
    for (int n = 1; n < 10; n++) 	
    { 		
        if (judge(n, i, j) != 0) 		
        { 			
            Sudoku[i][j] = n;
            if(dfs(i + (j == 8), (j + 1) % 9))
                return true;
            Sudoku[i][j] = 0;
       		}
    	} 	
    return false;
}

int dfs(int x,int y,int r2,int c2,int m,int n)
{//找迷宫图的路(适用求所有路)
    vis[x][y]=1;
    if (x==r2&&y==c2)
        pq.push(lu[x][y]);
    if (!(x>=0&&x<m&&y>=0&&y<n))
        return 0;
    for (int i=0;i<8;i++)
    {//这里是马走日 八条路
        int cx=x+X[i];
        int cy=y+Y[i];
        if (!tu[cx][cy]&&!vis[cx][cy])
        {
            //无注入
            if(dfs(cx,cy,r2,c2,m,n))
                return 1;
            //无取消注入
        }
    }
}

BFS

bfs_first

bfs_second

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值