【BFS/DFS/YY】派对灯
[luogu1468]派对灯
题目描述
在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码。 这些灯都连接到四个按钮:
按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮。
按钮2:当按下此按钮,将改变所有奇数号的灯。
按钮3:当按下此按钮,将改变所有偶数号的灯。
按钮4:当按下此按钮,将改变所有序号是3*K+1(K>=0)的灯。例如:1,4,7...
一个计数器C记录按钮被按下的次数。当宴会开始,所有的灯都亮着,此时计数器C为0。
你将得到计数器C(0<=C<=10000)上的数值和经过若干操作后某些灯的状态。写一个程序去找出所有灯最后可能的与所给出信息相符的状态,并且没有重复。
输入输出格式
输入格式:
不会有灯会在输入中出现两次。
第一行: N。
第二行: C最后显示的数值。
第三行: 最后亮着的灯,用一个空格分开,以-1为结束。
第四行: 最后关着的灯,用一个空格分开,以-1为结束。
输出格式:
每一行是所有灯可能的最后状态(没有重复)。每一行有N个字符,第1个字符表示1号灯,最后一个字符表示N号灯。0表示关闭,1表示亮着。这些行必须从小到大排列(看作是二进制数)。
如果没有可能的状态,则输出一行'IMPOSSIBLE'。
输入输出样例
10
1
-1
7 -1
0000000000
0101010101
0110110110
说明
在这个样例中,有三种可能的状态:
所有灯都关着
1,4,7,10号灯关着,2,3,5,6,8,9亮着。
1,3,5,7,9号灯关着,2, 4, 6, 8, 10亮着。
翻译来自NOCOW
USACO 2.2
试题分析:第一眼看:很暴力!但再看一眼,发现我们只需要枚举第一次的操作,然后看是否满足条件,条件分以下几种:
①变换完不满足要求 X
②变换完满足要求但最后调完会变成不满足要求的:(C-k)%2!=0
③调的次数大于C的
以二进制形式枚举1到16,每位表示这个操作用不用
然后经过处理不合法,在用结构体排一下序(因为方便)就AC了
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
//#include<cmath> using namespace std;
const int INF = 9999999;
#define LL long long inline int read(){
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
int N,C;
bool light[1001];
bool dark[1001];
bool cnt[1001];
int ta;
struct data{
int seq[105];
}ans[5001]; bool cmp(data a,data b){
for(int i=1;i<=N;i++){
if(a.seq[i]!=b.seq[i]) return a.seq[i]<b.seq[i];
}
} int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
N=read(),C=read();
int tmp;
tmp=read();
while(tmp!=-1){
light[tmp]=1;
tmp=read();
}
tmp=read();
while(tmp!=-1){
dark[tmp]=1;
tmp=read();
}
for(int i=1;i<=16;i++){
memset(cnt,1,sizeof(cnt));
int k=0;
if(i&(1<<0)){k++;for(int j=1;j<=N;j++) cnt[j]=1-cnt[j];}
if(i&(1<<1)){k++;for(int j=1;j<=N;j+=2) cnt[j]=1-cnt[j];}
if(i&(1<<2)){k++;for(int j=2;j<=N;j+=2) cnt[j]=1-cnt[j];}
if(i&(1<<3)) {k++;for(int j=0;3*j+1<=N;j++) cnt[3*j+1]=1-cnt[3*j+1];}
bool flag=true;
for(int i=1;i<=N;i++){
if(cnt[i]!=1&&light[i]==1){
flag=false;
break;
}
}
for(int i=1;i<=N;i++){
if(cnt[i]!=0&&dark[i]==1){
flag=false;
break;
}
}
if(!flag) continue;
if((C-k)%2!=0||k>C) continue;
++ta;
for(int j=1;j<=N;j++)
ans[ta].seq[j]=cnt[j];
}
if(!ta){
puts("IMPOSSIBLE");
return 0;
}
sort(ans+1,ans+ta+1,cmp);
for(int i=1;i<=ta;i++){
for(int j=1;j<=N;j++)
printf("%d",ans[i].seq[j]);
printf("\n");
}
return 0;
}
【BFS/DFS/YY】派对灯的更多相关文章
- POJ 2227 The Wedding Juicer (优先级队列+bfs+dfs)
思路描述来自:http://hi.baidu.com/perfectcai_/item/701f2efa460cedcb0dd1c820也可以参考黑书P89的积水. 题意:Farmer John有一个 ...
- 邻结矩阵的建立和 BFS,DFS;;
邻结矩阵比较简单,, 它的BFS,DFS, 两种遍历也比较简单,一个用队列, 一个用数组即可!!!但是邻接矩阵极其浪费空间,尤其是当它是一个稀疏矩阵的时候!!!-------------------- ...
- Collect More Jewels(hdu1044)(BFS+DFS)
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- 【搜索】P1468 派对灯 Party Lamps
P1468 派对灯 Party Lamps 我们来分析一下对灯的操作 1.对所有灯的,这时吧所有灯看成一个整体 2.奇偶数的操作,这时可以把每两个数看成一个循环节 3.对3X+ 1的操作,这时可以把每 ...
- luoguP1468 派对灯 Party Lamps x
P1468 派对灯 Party Lamps 题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当 ...
- Cleaning Robot (bfs+dfs)
Cleaning Robot (bfs+dfs) Here, we want to solve path planning for a mobile robot cleaning a rectangu ...
- LeetCode:BFS/DFS
BFS/DFS 在树专题和回溯算法中其实已经涉及到了BFS和DFS算法,这里单独提出再进一步学习一下 BFS 广度优先遍历 Breadth-First-Search 这部分的内容也主要是学习了labu ...
- BFS/DFS算法介绍与实现(转)
广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索.其中有很多的算法都用到了这两种思想,比 ...
- FZU 2150 Fire Game (bfs+dfs)
Problem Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M board ...
随机推荐
- 实现拷贝函数(strcpy)
#include <stdio.h> #include <stdlib.h> // 函数声明 char *mystrcpy(char *object, char *source ...
- HDU 1548 A strange lift (广搜)
题目链接 Problem Description There is a strange lift.The lift can stop can at every floor as you want, a ...
- ASP.NET 简单鼠标右键效果contextmenutrip
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...
- div圆角
div{ -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius: 10px;}
- Bower A package manager for the web
Bower can manage components that contain HTML, CSS, JavaScript, fonts or even image files. Bower doe ...
- SpringBoot工程目录配置
Spring Boot建议的目录结果如下: root package结构:com.example.myproject com +- example +- myproject +- Applicat ...
- Tomcat8配置默认项目
<!-- 配置默认访问项目 --> <Host name="localhost" appBase="webapps" unpackWARs=& ...
- 448D - Codeforces
D. Multiplication Table time limit per test 1 second memory limit per test 256 megabytes Bizon the C ...
- swift中的如果在构造方法中使用KVC, 调用了super.init(), 报错, 基本数据类型属性找不到
swift要求, 属性必须有初始化值, 如果不对其赋值, 可以加一个?系统会默认给其包装一个可选值(直说就是nil) 如果定义一个基本类型, 建议直接赋值, 不建议使用? 下面说下标题中的问题 有时候 ...
- Divide Two Integers——二分法的经典变形
Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...