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

相关文章

前端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 多重索引的分组聚

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

怎么关闭Ubuntu无人值守升级? Ubuntu禁止自动更新的技巧

《怎么关闭Ubuntu无人值守升级?Ubuntu禁止自动更新的技巧》UbuntuLinux系统禁止自动更新的时候,提示“无人值守升级在关机期间,请不要关闭计算机进程”,该怎么解决这个问题?详细请看... 本教程教你如何处理无人值守的升级,即 Ubuntu linux 的自动系统更新。来源:https://

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举