【错题集-编程题】体操队形(DFS + 枚举)

简介: 【错题集-编程题】体操队形(DFS + 枚举)

牛客对应题目链接:体操队形 (nowcoder.com)


一、分析题目

经验:因为数据量小,可以通过递归来做。

画出决策树,注意剪枝策略。


二、代码

//值得学习的代码
#include <iostream>
 
using namespace std;
 
const int N = 15;
 
int ret;
int n;
bool vis[N];
int arr[N];
 
void dfs(int pos)
{
    if(pos == n + 1) // 找到⼀种合法⽅案
    {
        ret++;
        return;
    }
 
    for(int i = 1; i <= n; i++)
    {
        if(vis[i]) continue; // 当前 i 已经放过了 - 剪枝
        if(vis[arr[i]]) return; // 剪枝
        vis[i] = true; // 相当于放上 i 号队员
        dfs(pos + 1);
        vis[i] = false; // 回溯- 还原现场
    }
}
 
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> arr[i];
 
    dfs(1);
 
    cout << ret << endl;
 
    return 0;
}

三、反思与改进

这道题真就一点思路也没有,看着数据量很小,想着模拟试试看,发现根本行不通。下次看到数据量小,可以尝试递归,暴力搜索来解决问题。


相关文章
|
传感器 算法 C语言
C语言基础算法---从数组中找最大最小值的实际应用
C语言基础算法---从数组中找最大最小值的实际应用
88 0
|
5月前
|
C++
【洛谷 P2241】统计方形(数据加强版)题解(循环枚举)
该题目是1997年普及组的一道编程题,要求计算$n\times m$棋盘中的正方形和长方形数量(不计正方形)。输入包含两正整数$n,m\leq 5000$。输出为一行,两个正整数分别表示正方形和长方形数量。示例输入`2 3`,输出`8 10`。解题思路是将矩形数拆分为正方形数和长方形数,然后通过双重循环计算。AC代码使用C++编写,通过累加方法得出结果。
51 0
|
5月前
|
C语言
C语言学习记录——鹏哥扫雷项目实现及递归展开、记录雷坐标
C语言学习记录——鹏哥扫雷项目实现及递归展开、记录雷坐标
69 0
|
6月前
【编程题-错题集】分组(枚举 + 二分)
【编程题-错题集】分组(枚举 + 二分)
|
6月前
|
自然语言处理 算法 编译器
编译原理复习四:编译器结构 消除左递归、左公因子 最右推导 寻找句柄讲解(附题目和答案)
编译原理复习四:编译器结构 消除左递归、左公因子 最右推导 寻找句柄讲解(附题目和答案)
156 0
|
人工智能 算法 测试技术
[蓝桥杯] 枚举、模拟和排列问题
[蓝桥杯] 枚举、模拟和排列问题
75 0
|
算法 C语言
[C语言][典例详解]打印杨辉三角(找规律简单实现)
[C语言][典例详解]打印杨辉三角(找规律简单实现)
145 0
|
C语言
C语言实例:创建各类三角形图案(杨辉三角,弗洛伊德三角形....)
C语言实例:创建各类三角形图案(杨辉三角,弗洛伊德三角形....)
150 0
|
算法 C语言
C语言练级之路num4(有关各种菱形的打印)(用的都是基础的算法),会了这些图形的打印,从此再无你不会用的循环,给你理解的透透的
1.第一题(边框菱形的打印) 2.第二题边框 菱形的进阶 3.第三题(数字菱形的打印) 4.第四题:(空心菱形) 5.第五题(实心菱形): 6.第六题:(外带一个杨氏三角的再一次打印)
枚举时对数组操——三刷AcWing 95. 费解的开关
枚举时对数组操——三刷AcWing 95. 费解的开关
64 0