特殊密码锁:主要考虑两种情况,第一个按钮按下或者不按下。因为一旦第一个按钮的状态确定了,后面的按钮也确定了;
例:第一个按钮没按下,若第一个按钮对应终止状态不同,则第二个按钮需要按下,以此类推。对应代码如下:
// password.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable:4996)//取消scanf报错
int len = 0;
void change(char a[], int s)
{
if (a[s] == '0')
a[s] = '1';
else
a[s] = '0';
}
void setchange(char a[], int s)
{
change(a, s);
if (s == 0)//翻面的特殊情况
change(a, s + 1);
else
{
change(a, s - 1);
change(a, s + 1);
}
}
int min(int i, int j)
{
if (i < j)
return i;
else
return j;
}
bool cmp(char a[], char b[])
{
for (int i = 0; i < len; i++)
{
if (a[i] != b[i])
return false;
}
return true;
}
int main()
{
char one[33], two[33];
char c1[35];
char c2[35];
scanf("%s", one);
scanf("%s", two);
len = strlen(one);
printf("%d\n", len);
memcpy(c1, one, len);//拷贝字符串
memcpy(c2, one, len);
//len = strlen(c1);
//printf("%d\n%s", len,c1);
int x1 = 0;
int x2 = 0;
//第一种情况 第一个不按下
for (int i = 0; i < len - 1; i++)
{
if (c1[i] != two[i])
{
setchange(c1, i + 1);
x1++;
if (cmp(c1, two))
break;
}
}
x2 = 1;//按下的情况
setchange(c2, 0);
if(cmp(c2,two))
{ }
else {
for (int i = 0; i < len - 1; i++)
{
if (c2[i] != two[i])
{
setchange(c2, i + 1);//对应不同则反转下一位
x2++;
if (cmp(c2, two))
break;
}
}
}
bool s1, s2;
s1 = cmp(c1, two);//如果都行的话选择最小的
s2 = cmp(c2, two);
//printf("%s", c1);
if(s1==false&&s2==false)
{
printf("\nimpossible\n");
}
else if (s1 == false && s2 != false)
{
printf("\n%d\n", x2);
}
else if (s1 != false && s2 == false)
{
printf("\n%d\n", x1);
}
else
{
printf("\n%d\n", min(x1, x2));
}
return 0;
}