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

相关文章

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

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的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误