DFS题目总结(基础题)

本文介绍了使用深度优先搜索(DFS)解决全排列问题和经典的N皇后问题。在DFS中,通过递归地尝试所有可能的选择并回溯来找出所有解决方案。对于1-N的全排列问题,利用DFS和布尔数组st记录状态,避免重复选择。而对于N-皇后问题,DFS用于在棋盘上放置皇后,同时检查每一步是否冲突。文章提供了详细的代码实现,展示了如何在C++中有效地应用DFS解决这类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. DFS输出1-n的全排列(acwing 842)

思路:输出排列方法,用DFS递归每一个搜索过程,用st记录每个数字有没有被访问。

 注意1.path不能用vector表示

dfs函数中,参数x表示选中的第几个数,不用return来回溯,如果用return回溯,就相当于图的遍历。如果选中大于n个数,函数会直接结束。

还要用一个path数组,记录路径。这里路径是选中的数,必须选到结尾后再一起输出。

​
# include<bits/stdc++.h>
using namespace std;
int n;
const int N = 10;
bool st[N];
int path[N];
void dfs(int x)
{
    if(x == n)
    {
        for (int i = 0; i < n; i ++ )
            cout<<path[i]<<" ";
        cout<<endl;
    }
    for (int i = 1; i <= n; i ++ )
        if(!st[i])
        {
            st[i] = true;
            path[x] = i;
            dfs(x+1);
            st[i] = false;
        }
}
int main()
{
    
    scanf("%d", &n);
    dfs(0);
}

​

2. n-皇后问题

### 关于蓝桥杯基础算法总结 #### 棋盘上的马跳跃问分析 在一个标准 $8 \times 8$ 的国际象棋棋盘上,马按照特定规则移动。给定初始位置 $(a, b)$ 和目标位置 $(c, d)$,判断是否存在路径使得马能够到达目标位置,并计算最小步数。 此问可以通过 **广度优先搜索 (BFS)** 来解决,因为 BFS 是一种逐层扩展的方式,适合用于求解最短路径问[^1]。具体来说: - 马每次可以从当前位置跳到最多八个可能的位置。 - 使用队列存储当前状态(即坐标和已走步数),并记录已经访问过的节点以避免重复计算。 以下是基于 Python 实现的一个解决方案: ```python from collections import deque def min_steps_knight(start_x, start_y, end_x, end_y): # 定义棋盘边界 board_size = 8 # 判断是否超出棋盘范围 def is_valid(x, y): return 0 <= x < board_size and 0 <= y < board_size # 可能的方向列表 directions = [ (-2, -1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1) ] # 初始化队列以及访问标记矩阵 queue = deque() visited = [[False for _ in range(board_size)] for _ in range(board_size)] # 将起点加入队列 queue.append((start_x, start_y, 0)) visited[start_x][start_y] = True while queue: current_x, current_y, steps = queue.popleft() # 如果达到终点,则返回步数 if current_x == end_x and current_y == end_y: return steps # 扩展所有可能方向 for dx, dy in directions: next_x, next_y = current_x + dx, current_y + dy if is_valid(next_x, next_y) and not visited[next_x][next_y]: visited[next_x][next_y] = True queue.append((next_x, next_y, steps + 1)) return -1 # 若无法到达则返回-1表示无解 ``` 上述代码实现了通过 BFS 寻找从起始点到终止点所需的最少步数的功能。 --- #### 图的深度优先遍历 (DFS) 对于图结构中的遍历操作,尤其是当遇到非连通图时,需要多次调用 DFS 函数来完成整个图的遍历[^2]。下面是一个简单的 C++ 版本实现示例: ```cpp #include <iostream> #include <vector> using namespace std; // 定义邻接表形式的图 class Graph { public: int V; vector<vector<int>> adj; Graph(int vertices); void addEdge(int v, int w); }; Graph::Graph(int vertices) : V(vertices), adj(vertices) {} void Graph::addEdge(int v, int w) { adj[v].push_back(w); // 添加边 } // 深度优先搜索函数 void DFSUtil(int v, bool visited[], const Graph& graph) { visited[v] = true; cout << v << " "; for(auto &i : graph.adj[v]){ if (!visited[i]) DFSUtil(i, visited, graph); } } // 主函数执行完整的深度优先遍历 void DFSTraverse(const Graph& graph){ bool *visited = new bool[graph.V]; for(int i=0;i<graph.V;i++) visited[i]=false; for(int u=0;u<graph.V;u++) if(!visited[u]) DFSUtil(u, visited, graph); } ``` 以上程序展示了如何处理非连通图的情况下的完全遍历过程。 --- #### 总结 针对蓝桥杯的基础题目,通常涉及一些经典的算法模型如 BFS 或者 DFS 等。这些方法不仅适用于竞赛环境,在实际开发场景也有广泛应用价值。掌握它们的核心思想及其变种应用模式是非常重要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值