noip 1995 灯的排列问题 排列组合 DFS
题目描述
设在一排上有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的更多相关文章
- Bzoj 4517: [Sdoi2016]排列计数(排列组合)
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MB Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ...
- C语言 · 排列数 · 排列式
蓝桥练习场上不断碰到类似的题,都是一个递归搜索的套路. 算法提高 排列数 时间限制:1.0s 内存限制:256.0MB 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下 ...
- 蓝桥杯--算法提高 排列数 (简单dfs)
算法提高 排列数 时间限制:1.0s 内存限制:256.0MB 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入 ...
- nyoj--19--擅长排列的小明(dfs)
擅长排列的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难 ...
- P1880 NOIP 1995石子合并
复习(du) 这道题,发现思想真不错 当时背板子打下来的 要下晚自习了,明天更注释吧 #include<iostream> #include<queue> #include&l ...
- 砝码组合(dfs)
砝码组合 题目内容:用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量.如果只有5个砝码,重量分别是1,3,9,27,81.则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两 ...
- 51nod 1268 和为K的组合 dfs
题目: 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K.如果可以,输出:& ...
- hdu 1258 从n个数中找和为t的组合 (DFS)
题意:首先给你一个t,然后是n,后面输入n个数,然后让你求的是n个数中和为t的序列总共有多少种,把他们按从左到右的顺序输出来. Sample Input4 6 4 3 2 2 1 15 3 2 1 1 ...
- 【noip模拟赛4】Matrix67的派对 dfs
描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排在圆桌上.Matrix67的安排原则是,圆桌 ...
随机推荐
- centos7 部署镜像仓库 harbor
=============================================== 2018/4/16_第2次修改 ccb_warlock 更新 ...
- 美国部分科技公司创始及IPO信息
作者:Ben.Z 时间:2018-04-19 做这份统计表格的目的是为了更好地了解当下美国的IT发展,搞清楚那些耳熟能详的名词的来源. 原文是用WPS统计的,本文仅展示截图. 创始人年龄分析: 1.上 ...
- 缓存数据库-redis数据类型和操作(set)
一:Redis 集合(Set) Redis的Set是string类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复 ...
- C语言位域——精妙使用内存
参考链接 https://blog.csdn.net/yanbober/article/details/8697967 https://blog.csdn.net/Tommy_wxie/artic ...
- tp杂记
/** php中的大U函数三个参数: U('ajaxDelPic') ==> /index.php/Admin/Goods/ajaxDelPic.html U('ajaxDelPic?id=1' ...
- INSTEAD OF与AFTER触发器
INSTEAD OF 触发器 AFTER 触发器(也叫“FOR”触发器)会在触发 insert.update 或是delect 动作之后执行.例如,一个 Employees 表上的 AFTER 触发器 ...
- Linux学习笔记:644、755、777权限详解
一.问题 1.在Linux或者Android系统下用命令ll或者ls -la的时候会看到前面-rw-rw-r--一串字符,不知道代表什么? 2.新建vi一个文件之后,经常需要chmod 755 fil ...
- mybatis中多条件判断---choose when的用法
<select id="getFunctionByPage" resultMap="FunctionRlt"> SELECT K.FUNCTION_ ...
- 34、疯狂java讲义第三版
内容中包含 base64string 图片造成字符过多,拒绝显示
- LANMPS 一键PHP环境安装包(转)
转:http://www.lanmps.com/ LANMPS 一键安装包,php绿色环境套件包: https://github.com/foxiswho/lanmps 安装 Mar 17, 2017 ...