当前位置: 代码迷 >> 综合 >> 百炼 特殊密码锁
  详细解决方案

百炼 特殊密码锁

热度:45   发布时间:2023-09-22 07:06:12.0

特殊密码锁:主要考虑两种情况,第一个按钮按下或者不按下。因为一旦第一个按钮的状态确定了,后面的按钮也确定了;
例:第一个按钮没按下,若第一个按钮对应终止状态不同,则第二个按钮需要按下,以此类推。对应代码如下:

// 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';elsea[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;elsereturn 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;
}

  相关解决方案