题目描述

设在一排上有N个格子(N≤20),若在格子中放置有不同颜色的灯,每种灯的个数记为N1,N2,……Nk(k表示不同颜色灯的个数)。

放灯时要遵守下列规则:

①同一种颜色的灯不能分开;

②不同颜色的灯之间至少要有一个空位置。

例如:N=8(格子数)

R=2(红灯数)

B=3(蓝灯数)

放置的方法有:

R-B顺序

R

R

B

B

B

R

R

B

B

B

R

R

B

B

B

R

R

B

B

B

R

R

B

B

B

R

R

B

B

B

B-R顺序

B

B

B

R

R

B

B

B

R

R

B

B

B

R

R

B

B

B

R

R

B

B

B

R

R

B

B

B

R

R

放置的总数为12种。

程序要求:求排列总数。

输入格式

数据输入的方式为:

N

P1(颜色,为一个字母) N1(灯的数量)

P2 N2

……

Q(结束标记,Q本身不是灯的颜色)

颜色和灯的数量之间由一个空格分隔。

输出

输出排列总数。

样例输入

8
R 2
B 3
Q

样例输出

12

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
struct color{
char aa;
int bb;
}q[];
struct node
{
char x;
int y;
}miss[];
int num=,s;
int sss=;
vector<int> qq[];
vector<int> m;
int kiss=;
void dfs(int a,int b,int c)
{
if(a==num&&b==s)
{
sss++;
//cout<<m.size()<<endl;
for(int i=;i<m.size();i++)
{
qq[kiss].push_back(m[i]);
}
kiss++;
for(int i=;i<m.size();i++)
{
cout<<qq[kiss-][i];
}
cout<<endl;
return;
}
if(b>s)
return;
if(c!=)
{
m.push_back();
dfs(a+,b+q[a].bb,);
m.pop_back();
}
m.push_back();
dfs(a,b+,);
m.pop_back(); }
int main()
{
kiss=;
int i,j;
int sum;
int ss=;
char a;
int b;
scanf("%d",&s);
int pp=;
while(cin>>a&&a!='Q')
{
miss[pp].x=a;
scanf("%d",&b);
miss[pp++].y=b;
ss=ss+b;
int t=;
for(i=;i<num;i++)
{
if(q[i].aa==a)
{
q[i].bb+=b;
t=;
}
}
if(t==)
{
q[num].aa=a;
q[num++].bb=b;
}
}
int per=;
for(i=;i<=num;i++)
per=per*i;
if(s-ss-num+<=)
cout<<<<endl;
else
{
dfs(,,);
/*
cout<<"1"<<endl;
for(int i=0;i<pp;i++)
cout<<miss[i].x<<" "<<miss[i].y<<endl;
*/
int a[];
for(int ii=;ii<kiss;ii++)
{
for(int i=;i<pp;i++)
a[i]=i;
int flag=;
for(int i=;i<qq[ii].size();i++)
{
//cout<<"1";
if(qq[ii][i]==)
cout<<" ";
else
{
for(int j=;j<miss[a[flag]].y;j++)
cout<<miss[a[flag]].x;
flag++;
}
}
cout<<endl; while(next_permutation(a,a+pp))
{
flag=;
for(int i=;i<qq[ii].size();i++)
{
if(qq[ii][i]==)
cout<<" ";
else
{
for(int j=;j<miss[a[flag]].y;j++)
cout<<miss[a[flag]].x;
flag++;
}
}
cout<<endl;
}
}
cout<<sss*per<<endl;
}
return ;
}

noip 1995 灯的排列问题 排列组合 DFS的更多相关文章

  1. Bzoj 4517: [Sdoi2016]排列计数(排列组合)

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MB Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ...

  2. C语言 · 排列数 · 排列式

    蓝桥练习场上不断碰到类似的题,都是一个递归搜索的套路. 算法提高 排列数   时间限制:1.0s   内存限制:256.0MB      问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下 ...

  3. 蓝桥杯--算法提高 排列数 (简单dfs)

    算法提高 排列数   时间限制:1.0s   内存限制:256.0MB      问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入 ...

  4. nyoj--19--擅长排列的小明(dfs)

    擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难 ...

  5. P1880 NOIP 1995石子合并

    复习(du) 这道题,发现思想真不错 当时背板子打下来的 要下晚自习了,明天更注释吧 #include<iostream> #include<queue> #include&l ...

  6. 砝码组合(dfs)

    砝码组合  题目内容:用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量.如果只有5个砝码,重量分别是1,3,9,27,81.则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两 ...

  7. 51nod 1268 和为K的组合 dfs

    题目: 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K.如果可以,输出:& ...

  8. hdu 1258 从n个数中找和为t的组合 (DFS)

    题意:首先给你一个t,然后是n,后面输入n个数,然后让你求的是n个数中和为t的序列总共有多少种,把他们按从左到右的顺序输出来. Sample Input4 6 4 3 2 2 1 15 3 2 1 1 ...

  9. 【noip模拟赛4】Matrix67的派对 dfs

    描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排在圆桌上.Matrix67的安排原则是,圆桌 ...

随机推荐

  1. centos7 部署镜像仓库 harbor

    =============================================== 2018/4/16_第2次修改                       ccb_warlock 更新 ...

  2. 美国部分科技公司创始及IPO信息

    作者:Ben.Z 时间:2018-04-19 做这份统计表格的目的是为了更好地了解当下美国的IT发展,搞清楚那些耳熟能详的名词的来源. 原文是用WPS统计的,本文仅展示截图. 创始人年龄分析: 1.上 ...

  3. 缓存数据库-redis数据类型和操作(set)

    一:Redis 集合(Set) Redis的Set是string类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复 ...

  4. C语言位域——精妙使用内存

    参考链接  https://blog.csdn.net/yanbober/article/details/8697967  https://blog.csdn.net/Tommy_wxie/artic ...

  5. tp杂记

    /** php中的大U函数三个参数: U('ajaxDelPic') ==> /index.php/Admin/Goods/ajaxDelPic.html U('ajaxDelPic?id=1' ...

  6. INSTEAD OF与AFTER触发器

    INSTEAD OF 触发器 AFTER 触发器(也叫“FOR”触发器)会在触发 insert.update 或是delect 动作之后执行.例如,一个 Employees 表上的 AFTER 触发器 ...

  7. Linux学习笔记:644、755、777权限详解

    一.问题 1.在Linux或者Android系统下用命令ll或者ls -la的时候会看到前面-rw-rw-r--一串字符,不知道代表什么? 2.新建vi一个文件之后,经常需要chmod 755 fil ...

  8. mybatis中多条件判断---choose when的用法

    <select id="getFunctionByPage" resultMap="FunctionRlt"> SELECT K.FUNCTION_ ...

  9. 34、疯狂java讲义第三版

    内容中包含 base64string 图片造成字符过多,拒绝显示

  10. LANMPS 一键PHP环境安装包(转)

    转:http://www.lanmps.com/ LANMPS 一键安装包,php绿色环境套件包: https://github.com/foxiswho/lanmps 安装 Mar 17, 2017 ...