牛客对应题目链接:体操队形 (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;
}
三、反思与改进
这道题真就一点思路也没有,看着数据量很小,想着模拟试试看,发现根本行不通。下次看到数据量小,可以尝试递归,暴力搜索来解决问题。