001特殊密码锁

代码可能有点搓,绝对原创!

 描述

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

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

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

输入

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

输出

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

样例输入

011
000

样例输出

1
#include <iostream>
#include <string>

using namespace std;

int PressCount(string passwndold,string passwndnew)
{
    if(passwndold==passwndnew) return 0;
    if(passwndnew.length()!=passwndold.length()) return -1;
    int presscount=0,k=0;
    for(int i=0;i<passwndold.length();i++)
    {
        if(passwndold[i]==passwndnew[i])
        {
            continue;
        }
        else
        {
			if(i==(passwndold.length()-1))
			{
				presscount=-1;
				return presscount;
			}
			else if(i==(passwndold.length()-2))
			{
				if(passwndold[i+1]!=passwndnew[i+1])
				{
					presscount++;
				}
				else if(passwndold[i+1]==passwndnew[i+1])
				{
					presscount=-1;
				}
				return presscount;
			}
			else if(i==(passwndold.length()-3))
			{
				if((passwndold[i+1]!=passwndnew[i+1])&&(passwndold[i+2]!=passwndnew[i+2]))
				{
					presscount++;
				}
				else if((passwndold[i+1]!=passwndnew[i+1])&&(passwndold[i+2]==passwndnew[i+2]))
				{
					presscount=-1;
				}
				else if((passwndold[i+1]==passwndnew[i+1])&&(passwndold[i+2]!=passwndnew[i+2]))
				{
					if(passwndold.length()==3)
					{
						presscount+=2;
					}
					else
					{
						presscount=-1;
					}
				}
				else if((passwndold[i+1]==passwndnew[i+1])&&(passwndold[i+2]==passwndnew[i+2]))
				{
					presscount=-1;
				}
				return presscount;
			}

			//if((passwndold[i+1]!=passwndnew[i+1])&&(passwndold[i+2]!=passwndnew[i+2]))
			//{
			//	presscount++;
			//	i=i+3;
			//	continue;
			//}

			if(passwndold[i+1]=='0')
			{
				passwndold[i+1]='1';
				presscount++;
			}
			else
			{
				passwndold[i+1]='0';
				presscount++;
			}
			if(passwndold[i]=='0')
			{
				passwndold[i]='1';
			}
			else
			{
				passwndold[i]='0';
			}
			if(passwndold[i+2]=='0')
			{
				passwndold[i+2]='1';
			}
			else
			{
				passwndold[i+2]='0';
			}
		}
    }

    return  presscount;
}

int main()
{
    string passwndold,passwndnew;
    cin>>passwndold;
    cin>>passwndnew;

	//考虑第一个按钮的特殊性
	int a=0,b=0;
	a=PressCount(passwndold,passwndnew);
	if(passwndold[0]=='0')
	{
		passwndold[0]='1';
		if(passwndold[1]=='0')
		{
			passwndold[1]='1';
		}
		else
		{
			passwndold[1]='0';
		}
	}
	else
	{
		passwndold[0]='0';
		if(passwndold[1]=='0')
		{
			passwndold[1]='1';
		}
		else
		{
			passwndold[1]='0';
		}
	}
	b=PressCount(passwndold,passwndnew);
	b+=1;


	if((a==-1)&&(b==0))
	{
		cout<<"impossible"<<endl;
	}
    else if((a!=-1)&&(b==0))
	{
		cout<<a<<endl;
	}
	else if((a==-1)&&(b!=0))
	{
		cout<<b<<endl;
	}
	else if((a!=-1)&&(b!=0))
	{
		if(a<=b)
		{
			cout<<a<<endl;
		}
		else
		{
			cout<<b<<endl;
		}
	}

//	cout<<passwndold<<endl;

    return 0;
}
发布了161 篇原创文章 · 获赞 17 · 访问量 73万+

猜你喜欢

转载自blog.csdn.net/nanfeiyannan/article/details/104249059