每日算法打卡:翻硬币 day 4

文章目录

原题链接

1208. 翻硬币

题目难度:简单

题目来源:第四届蓝桥杯省赛C++B组

题目描述

小明正在玩一个"翻硬币"的游戏。

桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。

比如,可能情形是:**oo***oooo

如果同时翻转左边的两个硬币,则变为:oooo***oooo

现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?

我们约定:把翻动相邻的两个硬币叫做一步操作。

输入格式

两行等长的字符串,分别表示初始状态和要达到的目标状态。

输出格式

一个整数,表示最小操作步数

数据范围

输入字符串的长度均不超过100。

数据保证答案一定有解。

输入样例1:
复制代码
**********
o****o**** 
输出样例1:
复制代码
5 
输入样例2:
复制代码
*o**o***o***
*o***o**o*** 
输出样例2:
复制代码
1 

题目分析

这个题就类似于之前的费解的开关的题目,每次翻硬币会同时带动两个硬币,问最少需要多少次到达目标状态

这一类问题其实是有一个固定形式的,是给定初态和末态,然后规定一些操作,问最少需要多少次操作可以从初态到达末态,这种问题一般有两种基本做法,一种就是宽搜(bfs),另一种就是递推做法

因此我们只需要从头到尾,依次保证前面的硬币符合条件即可,每一次使该位置和位置之后的硬币反转即可,而且题目保证了必有解

示例代码

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;
string src, dest; // src表示初态,dest表示末态
int ans = 0; // 步数
void turn(int cur) // 翻硬币
{
    if (src[cur] == '*')
        src[cur] = 'o';
    else if (src[cur] == 'o')
        src[cur] = '*';
    if (src[cur + 1] == '*')
        src[cur + 1] = 'o';
    else if (src[cur + 1] == 'o')
        src[cur + 1] = '*';
    ans++;
}
int main()
{
    cin >> src >> dest;
    for (int i = 0; i < src.size() - 1; i++) // 当对应位置状态不同时翻转
    {
        if (src[i] != dest[i])
            turn(i);
    }
    cout << ans;
    return 0;
}
相关推荐
find1star2 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing2 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21123 小时前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP4 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN4 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218314 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤5 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate5 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran6 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹6 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统