8469:特殊密码锁

简介: 总时间限制: 1000ms内存限制: 1024kB描述有一种特殊的二进制密码锁,由n个相连的按钮组成(n001(按下第一个)--->110(按下第二个)--->101(按下第三个) 算法分析:枚举+贪心参考 熄灯问题的讲解http://www.cnblogs.com/huashanqingzhu/p/7278930.html本题算是熄灯问题的简化版。
总时间限制: 1000ms内存限制: 1024kB
描述

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

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

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

输入
两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。
输出
至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。

样例输入1
011
000
样例输出1
1
样例输入2
111
101
样例输出2
3
样例2说明:111--->001(按下第一个)--->110(按下第二个)--->101(按下第三个)

算法分析:枚举+贪心
参考 熄灯问题的讲解http://www.cnblogs.com/huashanqingzhu/p/7278930.html
本题算是熄灯问题的简化版。 枚举第一个按钮是否按下的两种情况即可。第一个按钮的操作情况确定以后,后面的事情都是确定的。
也即,当第一个按钮操作完成以后,从第二个开始扫描:若发现前一个没有达到目的状态,只能通过操作当前按钮去修改前一个按钮的状态。以此类推,扫描完所有按钮为止。
最后:检验最后面一个按钮是否达到目的状态,若达到则该方案可以完成任务,但不一定是最优解(次数不一定是最小的。)因为第一个按钮的操作方案有两种。
所以要对第一个按钮的两种方案都做枚举求出各个方案对应的解,才能求最优解。

 

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main(int argc, char *argv[])
 4 {
 5     char src[35],target[35],temp[35];
 6     int i,len;
 7     int count,ans=1e9;
 8     
 9     scanf("%s%s",src,target);
10     len=strlen(src);
11     strcpy(temp,src);
12     
13     //第一种方案:第一个字符不修改,从下一个字符开始。
14     i=0;count=0;
15     i++;
16     while(src[i]!='\0')
17     {
18         if(src[i-1]!=target[i-1])//前一个元素不等,需要操作当前元素。操作当前元素影响到其左右元素。 
19         {
20             src[i]=src[i]^1;//取反
21             src[i-1]=src[i-1]^1;
22             if(i+1<len) src[i+1]=src[i+1]^1;
23             count++;
24         }
25         i++;
26     }
27     if(src[len-1]==target[len-1]) ans=count;
28         
29     //第二种方案:第一个字符修改
30     strcpy(src,temp);
31     i=0;//i重新指向第一个字符
32     src[i]=src[i]^1;
33     if(i+1<len) src[i+1]=src[i+1]^1;
34     count=1;
35     i++;
36     while(src[i]!='\0')
37     {
38         if(src[i-1]!=target[i-1])//前一个元素不等,需要操作当前元素。操作当前元素影响到其左右元素。 
39         {
40             src[i]=src[i]^1;//取反
41             src[i-1]=src[i-1]^1;
42             if(i+1<len) src[i+1]=src[i+1]^1;
43             count++;
44         }
45         i++;
46     }
47     if(src[len-1]==target[len-1]) ans=ans<count?ans:count;
48         
49     if(ans==1e9) printf("impossible\n");
50     else printf("%d\n",ans);
51     return 0;
52 }

 

可以参考:http://www.cnblogs.com/candy99/p/5791488.html

 

相关文章
|
编译器 C语言 C++
【C语言】malloc()函数详解(动态内存开辟函数)
【C语言】malloc()函数详解(动态内存开辟函数)
2153 2
|
机器学习/深度学习 人工智能 自然语言处理
大语言模型的Scaling Law:如何随着模型大小、训练数据和计算资源的增加而扩展
在这篇文章中,我们将介绍使这些模型运作的秘密武器——一个由三个关键部分组成的法则:模型大小、训练数据和计算能力。通过理解这些因素如何相互作用和规模化,我们将获得关于人工智能语言模型过去、现在和未来的宝贵见解。
1461 7
大语言模型的Scaling Law:如何随着模型大小、训练数据和计算资源的增加而扩展
|
10月前
|
存储 人工智能 调度
容器服务:智算时代云原生操作系统及月之暗面Kimi、深势科技实践分享
容器技术已经发展成为云计算操作系统的关键组成部分,向下高效调度多样化异构算力,向上提供统一编程接口,支持多样化工作负载。阿里云容器服务在2024年巴黎奥运会中提供了稳定高效的云上支持,实现了子弹时间特效等创新应用。此外,容器技术还带来了弹性、普惠的计算能力升级,如每分钟创建1万Pod和秒级CPU资源热变配,以及针对大数据与AI应用的弹性临时盘和跨可用区云盘等高性能存储解决方案。智能运维方面,推出了即时弹性节点池、智能应用弹性策略和可信赖集群托管运维等功能,进一步简化了集群管理和优化了资源利用率。
|
Java 开发者
Java一分钟之-JavaFX布局管理:GridPane, VBox, HBox
本文介绍了JavaFX的三种常用布局管理器:GridPane、VBox和HBox。GridPane用于创建二维网格布局,需设置行和列约束以防止控件重叠。VBox按垂直方向堆叠控件,记得设置间距。HBox水平排列控件,可能需要分配额外空间以避免水平滚动条。示例代码展示了这三种布局的使用。理解并运用这些布局管理器能提升JavaFX应用的界面设计。
609 0
|
存储 算法 数据可视化
Python 金融交易实用指南(一)(1)
Python 金融交易实用指南(一)
169 2
|
数据采集 JavaScript 前端开发
用爬虫解决问题
【5月更文挑战第12天】本文介绍了爬虫技术的基础、常见问题及解决方案,适合初学者和进阶开发者。文章涵盖爬虫概念、常用Python库(如Requests、BeautifulSoup、Scrapy)、反爬策略(更换User-Agent、使用代理IP、处理动态加载内容)以及代码示例。还强调了爬虫伦理与法律边界,性能优化、安全防护和进阶技巧,鼓励读者在实践中不断提升爬虫技能。
934 29
|
12月前
|
人工智能 自然语言处理 机器人
“今日热点:AI像人类一样使用手机和电脑”,魔搭社区的开源项目已先行一步
今天,Claude发布了Computer Use的新功能,可以让AI像人一样使用电脑!
|
缓存
计算机网络:可靠数据传输(rdt)、流水协议、窗口滑动协议
计算机网络:可靠数据传输(rdt)、流水协议、窗口滑动协议
1403 2
|
域名解析 存储 缓存
【域名解析DNS专栏】DNS缓存机制详解:如何提升域名解析速度
【5月更文挑战第21天】本文探讨了DNS缓存机制的原理及优化方法。DNS缓存是存储已解析域名与IP地址的临时数据库,能减少网络延迟,减轻服务器负担并提升用户体验。优化策略包括增加缓存容量,设置合理过期时间,使用智能DNS服务及定期清理缓存。文中还提供了一个Python示例,展示如何通过缓存提升域名解析速度。
1489 2
【域名解析DNS专栏】DNS缓存机制详解:如何提升域名解析速度
|
机器学习/深度学习 运维 监控