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的安排原则是,圆桌 ...
随机推荐
- sql loader 控制文件使用十六进制分隔符
最近项目中使用到了sql loader加载数据文件至数据库,提供的文件中使用了十六进制 7F5E 分隔符,在sql loader中如何加载呢? 经过查询实验后,控制文件ctl内容如下: load da ...
- js实现数据视图双向绑定原理
这个方法了不起啊..vue.js和avalon.js 都是通过它实现双向绑定的..而且Object.observe也被草案发起人撤回了..所以defineProperty更有必要了解一下了几行代码看他 ...
- eclipse导入/导出项目要注意三个地方
这个三个地方的jdk必须保持一致,不报错
- windows下同时安装python2和python3
之前学习的时候使用2.7比较多. 想练习3.7的时候,两个版本兼容的问题,苦恼了几天. 查了一下资料,发现了一个很好的方法.记录一下,也做一个分享. 本篇内容主要讲一下,在同一台电脑上如何同时安装Py ...
- MongoDB中多表关联查询(
1.使用aggregate 查看表数据 db.getCollection('reports').aggregate([ { $lookup: { from: "process", ...
- 前端程序员必知的30个Chrome扩展-[转载]
谷歌Chrome浏览器是网络上可用的最好浏览器之一,并且自2011年11月超越了Firefox浏览器之后,已经成为了互联网上占主导地位的浏览器.今天,HTML5中国与大家分享一些实用的谷歌Chrome ...
- Centos之其他帮助命令
选项帮助 命令 -help 获取命令选项的帮助 例如 ls --help 我们会发现用这种方式查看帮助命令 居然还有中文解释: 详细命令帮助info info 命令 -回车:进入子帮助页面(带有*号标 ...
- 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等
用SQL语句添加删除修改字段 1.增加字段 alter table docdsp add dspcode char(200) 2.删除字段 ALTER TABLE table_NAME DROP CO ...
- Alpine里的用户管理命令
注意噢,和普通的linux不一样的. 1, 建立一个指定GID的组: addgroup -g 10001 -S groupA 2, 建立一个指定UID的用户,指定shell, 让它属于指定的用户组. ...
- 微信小程序-视频教程-百度云-下载
链接: https://pan.baidu.com/s/16WGL3whutozx-UXqsDPhhA 提取码: 关注公众号[GitHubCN]回复获取 什么是微信小程序?小程序是一种不需要下载安 ...