蓝桥杯 2013 省 B 翻硬币
题目背景
小明正在玩一个“翻硬币”的游戏。
题目描述
桌上放着排成一排的若干硬币。我们用 *
表示正面,用 o
表示反面(是小写字母,不是零),比如可能情形是 **oo***oooo
,如果同时翻转左边的两个硬币,则变为 oooo***oooo
。现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
输入格式
两行等长字符串,分别表示初始状态和要达到的目标状态,每行长度小于 1000。
数据保证一定存在至少一种方案可以从初始状态和要达到的目标状态。
输出格式
一个整数,表示最小操作步数。
输入输出样例
输入 #1复制
********** o****o****
输出 #1复制
5
输入 #2复制
*o**o***o*** *o***o**o***
解析:这题用的知识就是两个等长字符串的匹配问题,博主本来看解析审题不认真,还以为每个数据只会有一段需要翻硬币匹配,结果就出现了下面的错误代码(样例都是只有一段需要匹配,所以样例都过了但是一测0分,好险,还好不是正式比赛)
#include<bits/stdc++.h>
using namespace std;
int main()
{
string stand;cin>>stand;
string nu;cin>>nu;
int cnt=0;
for(int i=0;i<stand.size();i++)
{
if(nu[i]!=stand[i])
{
if(nu[i+1]!=stand[i+1])
{
cnt++;
cout<<cnt;
return 0;//因为我以为只需要一段,处理完直接结束代码
}
else
{
if(nu[i+1]=='*')
{
cnt++;
nu[i+1]='o';
}
else if(nu[i+1]=='o')
{
cnt++;
nu[i+1]=='*';
}
}
}
}
return 0;
}
自己想了许久还没想出来,最后还是问舍友才解决了的,其实也简单,就是需要把串全部遍历了,不能提前结束
#include<bits/stdc++.h>
using namespace std;
int main()
{
string stand;cin>>stand;
string nu;cin>>nu;
int cnt=0;
for(int i=0;i<stand.size();i++)
{
if(nu[i]!=stand[i])//检测到不同开始翻硬币
{
nu[i+1]=(nu[i+1]=='*'?'o':'*');//因为遍历过的硬币不需要再用到,所以直接翻下一个就行,建议不会这种“ == ? : ” 写法的学习一下,有时候能很大地精简代码
cnt++;
}
}
cout<<cnt;
return 0;//修改之后发现,原来正确的代码比我的错误代码还要精简很多
自我检讨,尤其是蓝桥这种比赛制度,不怕题目简单,就怕自己掉以轻心