DFS模板 洛谷 P2089 P1605 P1101

本文详细介绍了DFS搜索模板的应用,包括注意事项和典型例题。通过三个具体的洛谷题目——P2089 烤鸡、P1605 迷宫和P1101 单词方阵,解析了DFS在不同场景下的思路和实现。强调了DFS中边界条件、搜索条件及状态标记的重要性。
摘要由CSDN通过智能技术生成

DFS模板

int search(int t)
{
   
    if(满足输出条件)
    {
   
        输出解;
        return;
    }
    else
    {
   
        for(int i=1;i<=尝试方法数;i++)
            if(满足进一步搜索条件)
            {
   
                为进一步搜索所需要的状态打上标记;
                search(t+1);
                恢复到打标记前的状态;//也就是说的{回溯一步}
            }
    }
}

注意

1.第一个if是符合输出解的条件,第二个if是符合进一步搜索的条件;

2.下一步搜索时,不是使用return search(t+1)而是直接search(t+1);(新手可能会注意不到这个关键的地方,以至于每次写完不知道为什么只得到一个答案就返回主程序了)
3.for循环之后的if可以是多个;

4.for循环边界,例如:

  • 方向是四个,那么边界肯定就是4;(帖主用3,是因为从0开始的)

  • 素数环需要尝试1至20,那么边界就是20;

例题1

洛谷 P2089 烤鸡

思路

∑ i = 0 9 a i = 10 ( 1 ) \sum_{i=0}^{9} a_{i} = 10 \quad\quad\quad(1) i=09ai=10(1)
其中,
1 ≤ a i ≤ 3 1 \leq a_{i} \leq 3 1ai3
试求满足(1)式的方案数。

方案数可达到 1 0 3 10^3 103 数量级,因此记录结果的数组要开到10000

C++代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <string>
#include <vector>
using namespace std;

const int maxn = 10000;
int a[maxn][15];
int mem[10];
int cnt;
int n;

void dfs(int t, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值