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

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

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

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

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

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

#include<bits/stdc++.h>
#include<cmath>
#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;i<n;i++)
            printf("%d ",rcd[i]);
        puts("");
        cnt++;
        return;
    }
    for(int i=0;i<m;i++)
    {
        if(used[i]>0 && !(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<n;i++)
        {
            scanf("%d",&val);
            for(j=0;j<m;j++)
            {
                if(a[j]==val)
                {
                    used[j]++; break;
                }
            }
            if(j==m) a[m]=val,used[m++]=1;
        }
        dfs(0);
        printf("cnt == %d\n",cnt);
    }
    return 0;
}
目录
相关文章
|
存储 算法 前端开发
前端算法-删除字符串中的所有相邻重复项
前端算法-删除字符串中的所有相邻重复项
|
8月前
|
存储 语音技术 索引
语音识别,列表的定义语法,列表[],列表的下标索引,从列表中取出来特定的数据,name[0]就是索引,反向索引,头部是-1,my[1][1],嵌套列表使用, 列表常用操作, 函数一样,需引入
语音识别,列表的定义语法,列表[],列表的下标索引,从列表中取出来特定的数据,name[0]就是索引,反向索引,头部是-1,my[1][1],嵌套列表使用, 列表常用操作, 函数一样,需引入
|
9月前
|
算法
现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的
现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的
77 1
|
运维 Shell Python
【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)(一)
【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)
156 0
|
10月前
|
算法 索引 Python
如何实现二分查找算法? 要求:编写一个Python函数,输入一个有序列表和一个目标值,返回目标值在列表中的索引。如果目标值不在列表中,返回-1。
如何实现二分查找算法? 要求:编写一个Python函数,输入一个有序列表和一个目标值,返回目标值在列表中的索引。如果目标值不在列表中,返回-1。
90 0
|
运维 Shell Perl
【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)(二)
【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)(二)
173 0
|
存储 算法 测试技术
LeetCode算法小抄--O(1)时间下删除-查找数组中任意元素
LeetCode算法小抄--O(1)时间下删除-查找数组中任意元素
|
JSON 数据格式 Python
一日一技:包含非hashable元素的列表如何去重并保持顺序?
一日一技:包含非hashable元素的列表如何去重并保持顺序?
140 0
leetcode 1047 删除字符串中的所有相邻重复
leetcode 1047 删除字符串中的所有相邻重复
75 0
leetcode 1047 删除字符串中的所有相邻重复
|
存储 算法 容器
Leetcode 76最小覆盖子串&77组合&78子集
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
133 0
Leetcode 76最小覆盖子串&77组合&78子集