【USACO 2.2.4】派对灯

时间:2021-05-27 09:39:36

【描述】

在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&sol;DFS&sol;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&period;2 Party Lamps 派对灯 &lpar;lamps&rpar;

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

  5. POJ 1176 Party Lamps&& USACO 2&period;2 派对灯(搜索)

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

  6. usaco 2&period;2&period;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. Gocd持续部署利器

    http://www.go.cd/documentation/user/current http://www.go.cd/images/home-image1.png Gocd 是ThoughtWor ...

  2. Form实现主从块金额汇总

    1.FORM使用app_calculate.running_total汇总行金额,行上有编码重复验证. 情况一:当录入多个编码重复的行并保存时,报错,清除一个重复行再保存(头行金额一致),报错&quo ...

  3. Linux自动登陆的设置方法

    前些天为了实现Linux自动登陆的方法,在网上查了很多资料,发现有不少方法,但网上有些方法的讲解不是特别清楚,或者已经过时.因此,特意整理了一下Linux自动登陆的设置方法.本文的测试环境为Cento ...

  4. Git客户端使用

    1.下载安装包 git:  https://git-for-windows.github.io/index.html tortoisegit: https://download.tortoisegit ...

  5. MVC中Filter拦截问题记录之重定向陷阱

    出错环境:被拦截的页面中使用了未实例化的对象,比如只有登录后才有的UserInfor对象. 理想中:浏览器请求页面时,会被Filter拦截,然后重定向到指定页面: 实际现象:将断点打入Filter中, ...

  6. 示例:Netty 处理 TCP数据分包协议

    一个.Netty解决TCP协议的数据分包的想法 我们知道通过TCP协议发送接收数据时,假设数据过大.接收到的数据会是分包的.比方:                                   ...

  7. spring aspect获取抽象基类日志

    在实际的项目开发过程中我们其实封装了很多的类似BaseService.BaseDao等的基类,然后在切日志的时候我们一般是指向继承改抽象基类的实现类的,这时候我们就会出现无法切出调用抽象基类方法的日志 ...

  8. Chrome disable cache &amp&semi; clear memory cache

    Chrome disable cache & clear memory cache disable cache

  9. sigmod2017&period;org

    http://sigmod2017.org/sigmod-program/#ssession20

  10. 帝国cms使用自定义函数获取新闻文章数 实例分享

    原文地址:http://www.jbxue.com/cms/24337.html 介绍了帝国cms系统中通过用户自定义函数获取用户发表新闻数量的方法,主要是分享下帝国cms自定义函数功能. 在帝国cm ...