题目

来源

中国MOOC网,程序设计与算法(二)第一周作业1 
http://cxsjsxmooc.openjudge.cn/2017t2springhw1/1/

限制

总时间限制: 1000ms 内存限制: 1024kB

描述

有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。

然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。

当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。

输入

两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。

输出

至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。

样例输入

011 
000

样例输出

1

解题报告

思路分析

首先思考枚举法,每个按钮有2种状态,但是最多可能有30个灯,因此状态有2^30之多,穷举一定会超时。

重点1 
一个灯如果按了第二下,就会抵消上一次按下所产生的影响。因此,一个灯只有按或者不按两种情况,不存在一个灯要开关多次的情况。

例如八个灯 00000000 
按1后 11000000 
按3后 10110000 
按1后 01110000 
这和八个灯 00000000 
只按一次3后 01110000 
是完全相同的情况

重点2 
我们只需要考虑是否按下第一个灯。因为如果第一个灯的状态被确定了,那么是否按下第二个灯也就决定了(如果第一个灯与期望不同,则按下,如果期望相同,则不按下)同理,第三个灯是否按下也唯一确定。

所以,本题只要分两种情况:灯1被按下和没有被按下 
之后使用for循环判断别的灯是否需要按下即可 

当循环结束,若现在的灯况与答案相同,则输出两种方案中按键次数最少的,若不同,则impossible!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;// 枚举第一个按钮是否按下的两种情况即可,对于指定的一种情况,后面的事情都是确定的int oriLock;
int lock;
int destLock;inline void SetBit(int& n, int i, int v)
{if (v)   // v 为1 {n |= (1 << i);   // 设置 n 的第 i 位为 1;}elsen &= ~(1 << i);  // 设置 n 的第 i 位为0;
}inline void  FlipBit(int &n, int i)
{n ^= (1 << i);  // 与 1 异或跳转,与 0 异或保持不变
}inline int GetBit(int n, int i)
{return (n >> i) &    1;  // 返回 n 的 第 i 位
}int main()
{char line[40];destLock = lock = oriLock = 0;cin >> line;int N = strlen(line);for (int i = 0; i < N; ++i)SetBit(oriLock, i, line[i] - '0'); // oriLock 保存原字符数组的每一位cin >> line;for (int i = 0; i < N; ++i)SetBit(destLock, i, line[i] - '0');int minTimes = 1 << 30;for (int p = 0; p < 2; ++p){ // p 代表最左边按钮, p 可能为0,或1lock = oriLock;     int times = 0;    // 统计次数int curButton = p;for (int i = 0; i < N; ++i){if (curButton){++times;if (i > 0)FlipBit(lock, i - 1);FlipBit(lock, i);if (i < N - 1)FlipBit(lock, i + 1);}if (GetBit(lock, i) != GetBit(destLock, i))curButton = 1;elsecurButton = 0;}if (lock == destLock)minTimes = min(minTimes, times);if (minTimes == 1 << 30)cout << " impossible" << endl;elsecout << minTimes << endl;}return 0;
}

OpenJudge 8469:特殊密码锁相关推荐

  1. NOI OpenJudge 8469 特殊密码锁 Label贪心

    描述 有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态. 然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转.当然,如果你 ...

  2. 分享几张塞尔达荒野之息精彩壁纸

    分享几张塞尔达荒野之息精彩壁纸 001-荒野之息经典封面.jpg 002-林克醒来看向海拉陆大陆经典场面.jpg 003-林克射箭特写.jpg 004-海拉鲁荒野之息.jpg 005-林克攀爬峭壁.j ...

  3. 投入OJ的怀抱~~~~~~~~~~

    OpenJudge C20182024 信箱(1) 账号 修改设定 退出小组 管理员 frank 林舒 Dzx someone 李文新 公告 11-05 程序设计与算法(大学先修课) 成员(61910 ...

  4. 投入OJ的怀抱~~~

    OpenJudge 登入 注册 管理员 frank 林舒 Dzx someone 李文新 公告 11-05 程序设计与算法(大学先修课) 成员(85168)查看全部 NOI(题库正在建设中,做题纪录有 ...

  5. 【NOI OJ】一大波题正在飞来(ˉ▽ ̄~) 我才不是 Ctrl C + Ctrl V 的人呢

    OpenJudge 登入 注册 管理员 frank 林舒 Dzx someone 李文新 公告 11-05 程序设计与算法(大学先修课) 成员(61647)查看全部 NOI(题库正在建设中,做题纪录有 ...

  6. 蓝桥杯刷题日记 更新到2022/2/5

    蓝桥杯刷题日记 文章目录 蓝桥杯刷题日记 DAY1 1.递归实现指数型枚举 2.递归实现组合型枚举 3.递归实现排列型枚举 Day2 1.八皇后问题 *2.费解的开关 3.带分数 Day3 1.飞行员 ...

  7. openJudge 特殊密码锁 ACM

    总时间限制: 1000ms 内存限制: 1024kB 描述 有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态. 然而让人头疼的是,当你按一 ...

  8. 基于fpga的数码管动态扫描电路设计_【至简设计案例系列】基于FPGA的密码锁设计(altera版)...

    秦红凯 明德扬FPGA科教 一.项目背景概述 随着生活质量的不断提高,加强家庭防盗安全变得非常重要,但传统机械锁的构造过于简单,很容易被打开,从而降低了安全性.数字密码锁因为它的保密性很高,安全系数也 ...

  9. iphone相册怎么加密_iphone相册加密码锁,保护隐私

    在以往很多使用iphone的小伙伴都会遇到一个难题,在不越狱的情况下进行给相册进行设置密码锁,这是一个无法完成的目标,在前几期也为大家分享了相册照片加密方法,但是用起来很是不方便,今天就为大家分享利用 ...

最新文章

  1. Java中? extends T和? super T的理解
  2. 除了芯片,我们还应关注这六大核心技术!
  3. 【Python实践-1】求一元二次方程的两个解
  4. 真正爱你的女人是这样的
  5. css 中的伪类选择器before 与after
  6. spring aop实践_使用Spring AOP实现活动记录模式
  7. 已跳过全部重新生成_2020年最新跳对公技术1+5,1+10,5+50(必读)
  8. java 反射 类名_java – 从反射中获取字段的类名
  9. 详解Python中genfromtxt的用法(numpy)
  10. Linux下virtualenv与virtualenvwrapper详解
  11. openlayers5学习笔记-001
  12. TLSF内存分配器记录
  13. 2016年1月.CN域名总量净增44.7万 增速环比下降
  14. java多态工作机制_Java多态
  15. matlab中ode指令,matlab中ode5函数编写.doc
  16. 解决ping/telnet本地localhost可以通过 ping/telnet本地ip无法通过问题
  17. 超好用的浏览器兼容性测试工具,赶紧收藏!
  18. 声学——声源定位阅读笔记
  19. 青云服务器换系统,青云科技发布新一代企业级云服务器e3:算力供给侧变革的强大助手...
  20. 1:基本初等函数的性质

热门文章

  1. 亚马逊代运营都包含哪些服务
  2. JavaScript代码实现ATM自动存取款功能
  3. android 恢复照片误删,安卓手机照片删除了怎么恢复?你不得不知道的恢复方法...
  4. Python基础考试题目
  5. 淘宝运营 促销活动天天特价报名操作方法,以及规则
  6. Apache NiFi深度扩展
  7. 朋友过生日,用Python给她画了个生日蛋糕
  8. 如何快速的将 DataTable 导入到 Excel 中 ?
  9. 一款类似跑跑卡丁车官方网漂亮的banner焦点图效果
  10. c语言编程输入5输出五行五列,C语言编程 在屏幕上打印五行*号,每行分别为5个,30个,10个,28个,16个。...