HDU2209 翻纸牌游戏【技巧】

2024-06-15 05:08
文章标签 技巧 游戏 纸牌 hdu2209

本文主要是介绍HDU2209 翻纸牌游戏【技巧】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2209


题目大意:

有N张牌,有正面朝上的,也有反面朝上的,现在需要把所有牌都正面朝上,已知每翻一张纸牌,

该纸牌左右两侧各一张纸牌也跟着翻动。现在给你一行只包含字符'0'和'1'的01字符串,'1'代表纸牌

反面,'0'代表纸牌正面。现在需要将字符串变为全为"0000…00"的字符串,一次操作只能改变一个

字符本身和它左右两侧各一个字符,问:最少要经过多少次操作,才能使字符串变为"0000…00"。

如果不能翻成"0000…00"的状态,则输出"NO"。


思路:

可以直接想到用广搜来找最小步数。但是观察后发现可以从前到后模拟一下就可以得到结果了。

因为从左向右翻纸牌,对于当前纸牌,只要当前纸牌左侧的纸牌'1',就不用翻动该纸牌,如果左侧纸

牌为'0',则必须翻动纸牌。而对于第一张纸牌来说,没有左侧纸牌,所以上述判断从第2张纸牌开始,

第一张纸牌有翻与不翻的两种情况,将这两种情况分别考虑。最后递推到最后一张纸牌,这时,除最

一张纸牌外,其余牌都已经变为"0000……0",只需要判断最后一张纸牌是不是'0',就可以知道是不

能够翻成"0000…00"状态了。如果两者都不能翻成这种状态,则结果输出"NO",否则,输出能翻出的

况中最小的情况。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;char s[22],a[22],b[22];int Min,Numa,Numb,Num,len,flag;void solveA()
{Num = 0;for(int i = 1; i < len; ++i){if(a[i-1] == '1'){a[i-1] = '0';if(a[i] == '0')a[i] = '1';elsea[i] = '0';if(i != len-1){if(a[i+1] == '0')a[i+1] = '1';elsea[i+1] = '0';}Num++;}}if(a[len-1] == '0'){Numa = Num;flag = 1;}  
}void solveB()
{Num = 0;if(b[0] == '1')b[0] = '0';elseb[0] = '1';if(b[1] == '1')b[1] = '0';elseb[1] = '1';Num++;for(int i = 1; i < len; ++i){if(b[i-1] == '1'){b[i-1] = '0';if(b[i] == '0')b[i] = '1';elseb[i] = '0';if(i != len-1){if(b[i+1] == '0')b[i+1] = '1';elseb[i+1] = '0';}Num++;}}if(b[len-1] == '0'){Numb = Num;flag = 1;}    
}int main()
{while(cin >> s){len = strlen(s);memset(a,0,sizeof(a));memset(b,0,sizeof(b));for(int i = 0; i < len; ++i)a[i] = b[i] = s[i];flag = 0;Numa = Numb = 0xffffff0;solveA();solveB();if(len == 1){if(s[0] == '1')cout << '1' << endl;elsecout << '0' << endl;continue;}if(flag == 0)cout << "NO" << endl;else{if(Numa < Numb)cout << Numa << endl;elsecout << Numb << endl;}}return 0;
}


这篇关于HDU2209 翻纸牌游戏【技巧】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062503

相关文章

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

电脑报错cxcore100.dll丢失怎么办? 多种免费修复缺失的cxcore100.dll文件的技巧

《电脑报错cxcore100.dll丢失怎么办?多种免费修复缺失的cxcore100.dll文件的技巧》你是否也遇到过“由于找不到cxcore100.dll,无法继续执行代码,重新安装程序可能会解... 当电脑报错“cxcore100.dll未找到”时,这通常意味着系统无法找到或加载这编程个必要的动态链接库

如何关闭 Mac 触发角功能或设置修饰键? mac电脑防止误触设置技巧

《如何关闭Mac触发角功能或设置修饰键?mac电脑防止误触设置技巧》从Windows换到iOS大半年来,触发角是我觉得值得吹爆的MacBook效率神器,成为一大说服理由,下面我们就来看看mac电... MAC 的「触发角」功能虽然提高了效率,但过于灵敏也让不少用户感到头疼。特别是在关键时刻,一不小心就可能触

前端bug调试的方法技巧及常见错误

《前端bug调试的方法技巧及常见错误》:本文主要介绍编程中常见的报错和Bug,以及调试的重要性,调试的基本流程是通过缩小范围来定位问题,并给出了推测法、删除代码法、console调试和debugg... 目录调试基本流程调试方法排查bug的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

Apache伪静态(Rewrite).htaccess文件详解与配置技巧

《Apache伪静态(Rewrite).htaccess文件详解与配置技巧》Apache伪静态(Rewrite).htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令,主要的... 一、.htAccess的基本作用.htaccess是一个纯文本文件,它里面存放着Apache服务器

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

Pandas中多重索引技巧的实现

《Pandas中多重索引技巧的实现》Pandas中的多重索引功能强大,适用于处理多维数据,本文就来介绍一下多重索引技巧,具有一定的参考价值,感兴趣的可以了解一下... 目录1.多重索引概述2.多重索引的基本操作2.1 选择和切片多重索引2.2 交换层级与重设索引3.多重索引的高级操作3.1 多重索引的分组聚