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