首页 > 其他分享 >二进制密码锁

二进制密码锁

时间:2023-07-11 23:12:37浏览次数:28  
标签:temp 二进制 res s1 times next print 密码锁

 

题解:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     string init, result; // 要操作的,预期的
 7     string temp;         // 记录当前状态
 8     cin >> init >> result;
 9     int n = init.length(), res = 31; // 最多加30次
10     for (int i = 0; i < 2; ++i)
11     {
12         // 当前状态
13         temp = init;
14 
15         int next = i, times = 0;
16 
17         for (int j = 0; j < n; ++j)
18         {
19             if (next == 1)
20             {
21                 ///////////////////
22                 if (j > 0)
23                     temp[j - 1] ^= 1; //^1即实现取反的效果
24                 temp[j] ^= 1;
25                 if (j < n - 1)
26                     temp[j + 1] ^= 1;
27                 ///////////////////
28                 // 以上实现相邻3位取反(边缘为2位)
29 
30                 times++; // 操作次数加1
31             }
32             if (temp[j] == result[j]) // 若两位相同,则不用按下一位
33                 next = 0;
34             else // 若不同,则要按下一位
35                 next = 1;
36             if (temp == result) // 如果能达到预期结果
37             {
38                 res = min(res, times); // 记录最小操作数
39                 break;
40             }
41         }
42     }
43     if (res != 31)
44         cout << res;
45     else // 无法达到预期
46         cout << "impossible";
47 
48     return 0;
49 }

 

 

python代码:

  注意tmp的拷贝问题

 1 s1 = input()
 2 s2 = input()
 3 s1, s2 = list(s1), list(s2)
 4 # tmp = s1 #temp修改会导致s1也被修改
 5 # print(id(tmp), id(s1))
 6 n = len(s1)
 7 res = 31
 8 for i in range(2):
 9     # temp = s1.copy() #这样就不会修改原s1的值,因为temp和s1内存地址不同
10     temp = list(s1)  # 与上一行等价
11     next = i
12     times = 0
13     # print(temp)
14     for j in range(n):
15         if next == 1:
16             if j > 0:
17                 temp[j - 1] = '1' if temp[j - 1] == '0' else '0'
18             temp[j] = '1' if temp[j] == '0' else '0'
19             if j < n - 1:
20                 temp[j + 1] = '1' if temp[j + 1] == '0' else '0'
21             times += 1
22             # print(times, end='&')
23             # if times == 1:
24             # print(temp)
25             # print(s1)
26             # if times == 2:print(temp)
27             # if times == 3:print(temp)
28             # if times == 4:print(temp)
29 
30         if temp[j] == s2[j]:
31             next = 0
32         else:
33             next = 1
34         if temp == s2:
35             res = min(res, times)
36             break
37 if res != 31:
38     print(res)
39 else: print('impossible')

 

标签:temp,二进制,res,s1,times,next,print,密码锁
From: https://www.cnblogs.com/nijigasaki14/p/17546208.html

相关文章

  • HJ62 查找输入整数二进制中1的个数
    1.题目读题HJ62 查找输入整数二进制中1的个数 考查点 这道题的考查点可能有以下几个方面:二进制的基本知识,如二进制的表示、转换、运算等,以及负数的补码表示方法。位运算的技巧,如如何利用与、或、异或、左移、右移等操作来实现一些常见的功能,如判断某一位是否为1、清......
  • MySQL5.6.x二进制包升级到5.7.x
    #!/bin/bash#mysql数据库用户名myuser="root"#mysql数据库密码mypwd="123456"#数据库备份路径dbbakdir="/data/dbbak"#数据库目录datadir="/data/mysql"#系统mysql用户sysmysqluser="mysql"#系统mysql组sysmysqlgroup="mysql"#my......
  • DAS二进制专项赛
    终究还是re✌更上流一些。卸载所有的前面555,又是一个月无所事事,还当了一回fw。爬回来学习一下专项赛的题目。笔者不是个铸币,比赛的时候一点也不会。easy-noteglibc-2.23的题目,UAF很明显,直接打_free_hook就行。当然打__malloc_hook,realloc调整栈帧也可。蒻纸笔者在比赛的时候......
  • 整数二进制奇数,偶数位的打印
    #include<stdio.h>voidPrint(intn){ inti=0; printf("偶数位:"); for(i=30;i>=0;i-=2) { printf("%d",(n>>i)&1); } printf("\n"); printf("奇数位:"); for(i=31;i>......
  • [渗透测试]—7.4 逆向工程和二进制破解技术
    在本章节中,我们将深入学习逆向工程和二进制破解技术。我们将尽量详细、通俗易懂地讲解,并提供尽可能多的实例。1.1逆向工程概述逆向工程是指从软件的二进制文件中提取信息,以了解其工作原理和设计思路的过程。逆向工程的主要目的是对软件进行分析、调试、修改等操作,以实现特定目......
  • 二进制转BCD8421码
    8421码是BCD码中最常用的编码,使用4位二进制表示十进制数0~9,即0000~1001。例如十进制数12转二进制为1100,转化为8421码为00010010(十进制为18),两个编码相减得6。二进制转8421的规则是≥10就加6,否则不加6进行校正。\[\begin{array}{r}10010B\\-1100B\\\hline0110B\end{array}......
  • 背包问题-二进制优化
    Smiling&Weeping----不讨好所有冷漠不辜负所有热爱 #[NOIP1996提高组]砝码称重 ##题目描述 设有$1\mathrm{g}$、$2\mathrm{g}$、$3\mathrm{g}$、$5\mathrm{g}$、$10\mathrm{g}$、$20\mathrm{g}$的砝码各若干枚(其总重$\le......
  • 401. 二进制手表
    这里可以通过遍历的方式做出来。i从0~1111111111进行遍历,如果1的个数等于要求的个数tournedOn,此时进一步判断时钟位和分钟为是否符合要求,满足要求则放入结果容器中。classSolution{public:vector<string>readBinaryWatch(intturnedOn){vector<string>res;......
  • 2023.6.29 重构 2 行二进制矩阵
    考虑贪心策略。每一列,把1优先放在lower和upper两行中较大的那一行上。implSolution{pubfnreconstruct_matrix(upper:i32,lower:i32,colsum:Vec<i32>)->Vec<Vec<i32>>{letn=colsum.len();let(mutupper,mutlower)=(upper,l......
  • 力扣---1253. 重构 2 行二进制矩阵
    给你一个 2 行 n 列的二进制数组:矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是 0 就是 1。第 0 行的元素之和为 upper。第 1 行的元素之和为 lower。第 i 列(从 0 开始编号)的元素之和为 colsum[i],colsum 是一个长度为 n 的整数数组。你需要利用 ......