求看一段OPJ的密码锁代码,应该是逻辑有问题,求教!!

西周舍利 2019-08-22 10:27:58
题目是:有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。
然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。
当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。
输入
两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。
输出
至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。

我的问题:有些测试数据可以得到正确的答案,有些不能,应该是逻辑有问题,实在没看出来应该怎么改。求教!!
#include <iostream>
#include <cstring>

#define N 50
using namespace std;

char oriCypher[N];//原始密码
char tarCypher[N];//目标密码
char cypher[N];//改动的密码

int GetBit(char c, int i){
return (c>>i) & 1;
}


void FlipBit(char c[],int i){
c[i] =c[i]^1;
}

int main(){
cin>>oriCypher>>tarCypher;//输入原始密码和目标密码
int len=strlen(oriCypher);


int i;
for(int k=0;k<len;k++){
memcpy(cypher,oriCypher,sizeof(oriCypher));
int caseNo=0;//按按钮操作次数
for(i=k;i<N;i++){
if(!strcmp(cypher,tarCypher)){//如果字符串相等
cout<<caseNo<<endl;
return 0;}

else{
if(i>0)
FlipBit(cypher,i-2);//修改左边数字
FlipBit(cypher,i);//修改当前数字
if(i<len)
FlipBit(cypher,i+1);//修改右边数字
caseNo++;
if(caseNo>30){
cout<<"impossible"<<endl;
return 0;//操作30次以上都没有实现,应该是不可能实现了
}
}
}
}
return 0;
}
...全文
32 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧