博客
关于我
POJ算法练习-特殊密码锁
阅读量:259 次
发布时间:2019-03-01

本文共 1380 字,大约阅读时间需要 4 分钟。

关键是要想清楚,最边上可以翻转,也可以不翻转,在这两种情况定下来后,后面的逐一比较。实际上这就是最少的操作数

#include 
#include
#include
#include
using namespace std; int oriLock;int lock;int destLock;inline void SetBit(int & n,int i,int v){ if(v) n |= (1 << i); //把第i位设为1 else n &= ~(1 << i); //把第i位设为0 }inline void FlipBit(int & n,int i){ n ^= (1 << i); //反转第i位 }inline int GetBit(int n,int i){ return (n >> i) & 1; //取出第i位 }int main(){ char line[40]; //字符数组储存二进制数字 destLock = lock = oriLock = 0; //oriLock为原始结果,destLock为目标结果 cin >> line; int N = strlen(line); //长度 for(int i = 0; i < N; ++i) //将字符串转化为二进制数字 SetBit(oriLock,i, line[i] - '0'); cin >> line; for(int i = 0; line[i]; ++i) SetBit(destLock,i, line[i] - '0'); int minTimes = 1 << 30; for(int p = 0; p < 2; ++p) { lock = oriLock; int times = 0; int curButton = p; for(int i = 0; i < N; ++i) { if(curButton) { ++ times; if( i > 0) //如果i大于0,那么i后一位也翻转 FlipBit(lock,i-1); FlipBit(lock,i); if( i < N-1) //如果i小于N-1,那么i前一位也翻转 FlipBit(lock,i+1); } if( GetBit(lock,i) != GetBit(destLock,i)) // curButton = 1; //执行翻转 else curButton = 0; //否就跳过 } if( lock == destLock) minTimes = min(minTimes ,times); } if( minTimes == 1 << 30) cout << "impossible" << endl; else cout << minTimes << endl; return 0;}

转载地址:http://bdhv.baihongyu.com/

你可能感兴趣的文章
node.js 怎么新建一个站点端口
查看>>
Node.js 文件系统的各种用法和常见场景
查看>>
Node.js 模块系统的原理、使用方式和一些常见的应用场景
查看>>
Node.js 的事件循环(Event Loop)详解
查看>>
node.js 简易聊天室
查看>>
Node.js 线程你理解的可能是错的
查看>>
Node.js 调用微信公众号 API 添加自定义菜单报错的解决方法
查看>>
node.js 配置首页打开页面
查看>>
node.js+react写的一个登录注册 demo测试
查看>>
Node.js中环境变量process.env详解
查看>>
Node.js之async_hooks
查看>>
Node.js也分裂了-开源社区动态
查看>>
Node.js创建第一个应用
查看>>
Node.js初体验
查看>>
Node.js升级工具n
查看>>
Node.js卸载超详细步骤(附图文讲解)
查看>>
Node.js卸载超详细步骤(附图文讲解)
查看>>
Node.js基于Express框架搭建一个简单的注册登录Web功能
查看>>
node.js学习之npm 入门 —8.《怎样创建,发布,升级你的npm,node模块》
查看>>
Node.js安装与配置指南:轻松启航您的JavaScript服务器之旅
查看>>