【描述】

在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)上的数值和经过若干操作后某些灯的状态。写一个程序去找出所有灯最后可能的与所给出信息相符的状态,并且没有重复。

【格式】

PROGRAM NAME: lamps

INPUT FORMAT:

(file lamps.in)

不会有灯会在输入中出现两次。

第一行: N。

第二行: C最后显示的数值。

第三行: 最后亮着的灯,用一个空格分开,以-1为结束。

第四行: 最后关着的灯,用一个空格分开,以-1为结束。

OUTPUT FORMAT:

(file lamps.out)

每一行是所有灯可能的最后状态(没有重复)。每一行有N个字符,第1个字符表示1号灯,最后一个字符表示N号灯。0表示关闭,1表示亮着。这些行必须从小到大排列(看作是二进制数)。

如果没有可能的状态,则输出一行'IMPOSSIBLE'。

【分析】

 #include <cstdlib>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <queue>
#include <algorithm>
const int Max=(<<)+;
using namespace std;
struct node
{
int state;
int step;//已经走过的步数
}sta;
int Check[],n,c,ans[Max];
int vis[(<<)+][],ans_point=;
inline int MOD(int t) {return (t%)==?:t%;}//取模运算
inline int get(int num,int i) {return (num&(<<i))==(<<i);}
void bfs();
bool check(int num);
int main()
{
int t,i,j;
//文件操作
freopen("lamps.in","r",stdin);
freopen("lamps.out","w",stdout);
memset(Check,-,sizeof(Check)); scanf("%d%d",&n,&c);
while (scanf("%d",&t) && t!=-) Check[MOD(t)]=;//最后亮着的
while (scanf("%d",&t) && t!=-) Check[MOD(t)]=;//最后黑着的
bfs();
sort(ans,ans+ans_point);
if (ans_point==) printf("IMPOSSIBLE\n");
for (i=;i<ans_point;i++)
{
for (j=;j<=n;j++) printf("%d",get(ans[i],MOD(j)-));
printf("\n");
}
return ;
}
void bfs()
{
memset(vis,,sizeof(vis));
queue<node>Q;
sta.state=(<<)-;sta.step=;
Q.push(sta);
while (!Q.empty())
{
node u=Q.front();Q.pop();
if (check(u.state) && u.step==c) {ans[ans_point++]=u.state;continue;}
node v;v=u;
v.step=u.step+;
//四种操作
v.state=v.state^((<<)-);if (vis[v.state][v.step]==) {vis[v.state][v.step]=;Q.push(v);}v=u;v.step=u.step+;
v.state=v.state^()^(<<)^(<<);if (vis[v.state][v.step]==) {vis[v.state][v.step]=;Q.push(v);}v=u;v.step=u.step+;
v.state=v.state^(<<)^(<<)^(<<);if (vis[v.state][v.step]==) {vis[v.state][v.step]=;Q.push(v);}v=u;v.step=u.step+;
v.state=v.state^()^(<<);if (vis[v.state][v.step]==) {vis[v.state][v.step]=;Q.push(v);}v=u;v.step=u.step+;
}
}
bool check(int num)
{
for (int i=;i<min(n,);i++) if (Check[i+]!=get(num,i) && Check[i+]!=-) return ;
return ;
}

【USACO 2.2.4】派对灯的更多相关文章

  1. 【BFS/DFS/YY】派对灯

    [luogu1468]派对灯 题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将 ...

  2. luoguP1468 派对灯 Party Lamps x

    P1468 派对灯 Party Lamps 题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当 ...

  3. 【搜索】P1468 派对灯 Party Lamps

    P1468 派对灯 Party Lamps 我们来分析一下对灯的操作 1.对所有灯的,这时吧所有灯看成一个整体 2.奇偶数的操作,这时可以把每两个数看成一个循环节 3.对3X+ 1的操作,这时可以把每 ...

  4. USACO 2.2 Party Lamps 派对灯 (lamps)

    题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码.这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭 ...

  5. POJ 1176 Party Lamps&& USACO 2.2 派对灯(搜索)

    题目地址 http://poj.org/problem?id=1176 题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都 ...

  6. usaco 2.2.4 生日派对灯(最近写题碰到的,虽然知道现在写这个有点晚了)

    经过分析,他看似很多的开灯的方法其实合并起来就只有八个. 首先,一个开关在执行的时候只能按一次(因为你就算按了两次就相当于一次也没有按). 当一个都不按的时候  当然就只有一种:不按. 当按一下的时候 ...

  7. luogu P1468 派对灯 Party Lamps

    题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄 ...

  8. P1468 派对灯 Party Lamps(BIG 模拟)

    题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄 ...

  9. jzoj P1163 生日派对灯

    在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码.这些灯都连接到四个按钮:  按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是 ...

随机推荐

  1. 带你走进EJB--MDB实现发送邮件(1)

    在实际的项目中我们有这样的需求,用户注册网站成功之后系统会自动的给注册用户发送注册成功通知邮件,而发送通知邮件的具体过程我们可以通过MDB来实现. 在用MDB来实现发送通知过程之前我们需要先了解一下J ...

  2. width:auto; 和 width:100%;的不同

    width:auto:会将元素撑开至整个父元素width,但是会减去子节点自己的margin,padding或者border的大小.width:100%:会强制将元素变成和父元素一样的宽,并且添加额外 ...

  3. Unity GUI编程

    脚本语言:C# 附上一张图说明Unity GUI编程中可用的控件:(可能有遗漏) 下面列出一些例子来说明: 1.Groups : 在固定Layout模式中起到组织可用项的功能,它让你在屏幕的一个区域中 ...

  4. 【KMP】【最小表示法】NCPC 2014 H clock pictures

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1794 题目大意: 两个无刻度的钟面,每个上面有N根针(N<=200000),每个 ...

  5. Binary Tree Zigzag Level Order Traversal——LeetCode

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  6. Apache multiple domains setup

    Running several name-based web sites on a single IP address. Your server has a single IP address, an ...

  7. denyhost

    1. denyhost 简介及ssh安全 对外提供的服务器,每天都会被恶意扫描,试图暴力穷举密码,达到入侵的目的.从而控***务器,占用资源.网页挂马.垃圾广告.更会影响我们业务的正常使用和数据的安全 ...

  8. zznu 1068: 进制转换

    进制应该属于程序员的看家本事了,也是大家水平告别菜鸟的一个转折,所以进制转换题目是很有意义的, 这个题目是最简单的把二进制数化简成十进制,因为输入有可能有31位,所以无法使用int或者long lon ...

  9. POI操作文档内容

    一. POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 二. HSSF概况 HSSF 是 ...

  10. Jupyter Notebook 对LaTeX 的支持

    Jupyter的Markdown模式比我原来想想的更加强大:它支持LaTeX! 支持的特性不多,应该能满足一般的需求了.