敢死队

来源:互联网 发布:最大子数组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
原创粉丝点击