翻硬币

本文最后更新于:41 分钟前

[蓝桥杯 2013 省 B] 翻硬币

题目背景

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

题目描述

桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零),比如可能情形是 **oo***oooo,如果同时翻转左边的两个硬币,则变为 oooo***oooo。现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?

输入格式

两行等长字符串,分别表示初始状态和要达到的目标状态,每行长度小于 1000

数据保证一定存在至少一种方案可以从初始状态和要达到的目标状态。

输出格式

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

样例 #1

样例输入 #1

1
2
**********
o****o****

样例输出 #1

1
5

样例 #2

样例输入 #2

1
2
*o**o***o***
*o***o**o***

样例输出 #2

1
1

理解:

从前往后翻,前面的硬币只能由后面的硬币来控制,从前往后进行递推。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
string s1,s2;

int main()
{
cin>>s1>>s2;
int cnt=0;
for(int i=0;i<s1.length()-1;i++)
{
if(s1[i]==s2[i])continue;
else
{
s1[i]=s2[i];
if(s1[i+1]=='o')
{
s1[i+1]='*';
cnt++;
}
else
{
s1[i+1]='o';
cnt++;
}
}
}
if(s1[s1.length()]!=s2[s2.length()])cnt++;
cout<<cnt<<endl;
}


翻硬币
http://example.com/2023/04/24/翻硬币/
作者
zzh
发布于
2023年4月24日
更新于
2023年4月24日
许可协议
原文链接: HTTPS://ZHANGZHIHAO-BLOG.GITHUB.IO
版权声明: 转载请注明出处!