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

你可能感兴趣的文章
Netty工作笔记0059---Netty私聊实现思路
查看>>
Netty工作笔记0060---Netty心跳机制实例
查看>>
Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
查看>>
Netty工作笔记0061---Netty心跳处理器编写
查看>>
Netty工作笔记0063---WebSocket长连接开发2
查看>>
Netty工作笔记0065---WebSocket长连接开发4
查看>>
Netty工作笔记0066---Netty核心模块内容梳理
查看>>
Netty工作笔记0068---Protobuf机制简述
查看>>
Netty工作笔记0070---Protobuf使用案例Codec使用
查看>>
Netty工作笔记0071---Protobuf传输多种类型
查看>>
Netty工作笔记0072---Protobuf内容小结
查看>>
Netty工作笔记0073---Neety的出站和入站机制
查看>>
Netty工作笔记0074---handler链调用机制实例1
查看>>
Netty工作笔记0075---handler链调用机制实例1
查看>>
Netty工作笔记0076---handler链调用机制实例3
查看>>
Netty工作笔记0077---handler链调用机制实例4
查看>>
Netty工作笔记0078---Netty其他常用编解码器
查看>>
Netty工作笔记0079---Log4j整合到Netty
查看>>
Netty工作笔记0080---编解码器和处理器链梳理
查看>>
Netty工作笔记0081---编解码器和处理器链梳理
查看>>