敢死队
来源:互联网 发布:最大子数组java 编辑:程序博客网 时间:2024/04/28 07:46
题目
这里牵涉一个是否要考虑按照顺序的问题。
如 132 和 123 表示的是一种情况,对于这种情况要进行排除
我的思路是 集中从小到大排序。
#include<iostream>#include<cstring>using namespace std;int cap[1000]={0};int num[1000];int n;int cnt = 0; int check(int n){ for(int i = 1; i < n; i++) { //所选人有重复 if(num[n]==num[i]) { return 0; } //所选人为其他人的队长 if(num[i] == cap[num[n]]||cap[num[i]]==num[n]) { return 0; } } return 1; }void dfs(){ memset(num,0,sizeof(num)); int k = 1; while(k>0) { /*用于消除 132 123 的结果因为这表示同一种结果*/ if(num[k]<=num[k-1]) { num[k] = num[k-1]+1; } else { num[k]++; } int flag = check(k); while(num[k]<=n&&!flag) { num[k]++; flag = check(k); } if(num[k]<=n) { cnt++; for(int i = 1; i <= k; i++) { cout << num[i] << ends; } cout << endl; if(k<n) { k++; } else { num[k] = 0; k--; } } else { num[k] = 0; k--; } }}int main(){ cin >> n; cap[1] = 0; for(int i = 2; i <= n; i++) { cin >> cap[i]; } dfs(); cout << cnt; return 0;}
0 0