博客
关于我
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/

你可能感兴趣的文章
Nginx SSL私有证书自签,且反代80端口
查看>>
Nginx upstream性能优化
查看>>
Nginx 中解决跨域问题
查看>>
nginx 代理解决跨域
查看>>
Nginx 做负载均衡的几种轮询策略分析
查看>>
Nginx 入门,一篇搞定!
查看>>
Nginx 动静分离与负载均衡的实现
查看>>
Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
查看>>
nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
查看>>
Nginx 反向代理+负载均衡
查看>>
Nginx 反向代理解决跨域问题
查看>>
Nginx 反向代理配置去除前缀
查看>>
nginx 后端获取真实ip
查看>>
Nginx 多端口配置和访问异常问题的排查与优化
查看>>
Nginx 如何代理转发传递真实 ip 地址?
查看>>
Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
查看>>
Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
查看>>
Nginx 学习(一):Nginx 下载和启动
查看>>
nginx 常用指令配置总结
查看>>
Nginx 常用配置清单
查看>>