AcWing 92. 递归实现指数型枚举【DFS】【递归】


一、题目链接

AcWing 92. 递归实现指数型枚举
在这里插入图片描述
在这里插入图片描述


二、题目分析

(一)算法标签

DFS 递归

(二)解题思路

DFS最重要的就是顺序
本题从前往后(1~n)依次考虑每个数选或者不选

详细了解搜索类题目(DFS、BFS),请移步DFS BFS 搜索题目归纳


三、AC代码

解法一:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 16;

int n;
int st[N];  // 0 :未考虑 1: 不选  2 :选
void dfs(int u)
{
    if (u > n)
    {
        for (int i = 1; i <= n; i++ )
            if (st[i] == 2)
                printf("%d ", i);
        puts("");
        return;
    }
    st[u] = 1;
    dfs(u + 1);
    st[u] = 0;
    
    st[u] = 2;
    dfs(u + 1);
    st[u] = 0;
}
int main()
{
    cin >> n;
    dfs(1);
    return 0;
}

用vector<vector>记录方案

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 16;

int n;
int st[N];  // 0 :未考虑 1: 不选  2 :选
// 记录方案  一共有2^N个方案,每个方案最多N个数,所以第一维是1 << N,第二维是N

vector<vector<int>> ways;
void dfs(int u)
{
    if (u > n)
    {
        vector<int> way;
        for (int i = 1; i <= n; i++ )
            if (st[i] == 2)
                way.push_back(i);
        ways.push_back(way);
        return;
    }
    st[u] = 1;
    dfs(u + 1);
    st[u] = 0;
    
    st[u] = 2;
    dfs(u + 1);
    st[u] = 0;
}
int main()
{
    cin >> n;
    dfs(1);
    for (int i = 0; i < ways.size(); i ++ )
    {
        for (int j = 0; j < ways[i].size(); j ++ )
            printf("%d ", ways[i][j]);
        puts("");
    }
    return 0;
}

四、其它题解

AcWing 92. 递归实现指数型枚举

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是 Python 中 DFS 实现迷宫问题的代码示例: ```python # 定义迷宫地图,0 表示可走,1 表示障碍物 maze = [ [0, 1, 0, 0, 0], [0, 1, 0, 1, 0], [0, 0, 0, 0, 0], [0, 1, 1, 1, 0], [0, 0, 0, 1, 0], ] # 定义迷宫大小 n = len(maze) m = len(maze[0]) # 定义标记数组,标记每个位置是否已经访问过 visited = [[False] * m for _ in range(n)] # 定义终点位置 end = (4, 3) # 定义方向数组,表示上下左右四个方向 directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] def dfs(x, y): # 如果当前位置就是终点位置,则直接返回 True if (x, y) == end: return True # 标记当前位置已经访问过 visited[x][y] = True # 枚四个方向 for dx, dy in directions: nx, ny = x + dx, y + dy # 判断是否越界,是否已经访问过,是否是障碍物 if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny] and maze[nx][ny] == 0: # 归搜索下一个位置 if dfs(nx, ny): return True # 如果四个方向都没找到终点,则返回 False return False # 在起点位置开始搜索 start = (0, 0) if dfs(start[0], start[1]): print("可以到达终点!") else: print("无法到达终点!") ``` 这段代码中,我们先定义了一个迷宫地图 `maze`,然后定义了迷宫的大小 `n` 和 `m`,以及标记数组 `visited` 和终点位置 `end`。 接着,我们定义了一个 DFS 函数 `dfs`,它的参数是当前位置的坐标 `(x, y)`,表示从这个位置开始搜索。 在 `dfs` 函数中,我们首先判断当前位置是否是终点位置,如果是,则直接返回 True。 然后,我们标记当前位置已经访问过,并枚当前位置可以走的四个方向。对于每个方向,我们判断是否可以走,如果可以,则归搜索下一个位置。如果在四个方向中找到了终点位置,则返回 True。 最后,在主函数中,我们从起点位置开始搜索,如果可以到达终点,则输出“可以到达终点!”;否则输出“无法到达终点!”。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值