ACM模板——排列 - 不重复全排列(DFS + 计数 + 附加规则)

说明:不重复排列:指的是排列当中没有重复的序列,不是说里面的元素没有重复。

附加规则:针对:1 2 2 3 4 5(六个数字)

1、数字4 不能放在第三位置上。

2、数字3 和 数字5 不能相邻(不包括首尾)。

#include
#include

#define mem(a,b) memset(a,b,sizeof a)
#define INF 0x3f3f3f3f

using namespace std;

typedef long long ll;

int n,m,cnt,used[10],rcd[6],a[10];

void init()
{
    m=cnt=0;
    mem(rcd,0);
    mem(used,0);
}

void dfs(int l)
{
    if(l==n)
    {
        for(int i=0;i0 && !(a[i]==4&&l==2)) // used[i]还有个数 && 数字4 不能放在第三个位置上
        {
            // 数字5 和 数字3 不能相邻,不包括首尾
            if(l-1>=0&&a[i]==5&&rcd[l-1]==3 || l-1>=0&&a[i]==3&&rcd[l-1]==5)
                continue;

            used[i]--;
            rcd[l]=a[i];
            dfs(l+1);
            used[i]++;
        }
    }
}

int main()
{
    while(~scanf("%d",&n))
    {
        init();
        int val,j;
        for(int i=0;i

你可能感兴趣的:(#,技巧题集,#,DFS,#,排列,#,ACM,#,ACM,模板)