【错题集-编程题】体操队形(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;
}

三、反思与改进

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

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值