首页 > 学院 > 开发设计 > 正文

第四届蓝桥杯【省赛试题8】翻硬币

2019-11-06 07:40:46
字体:
来源:转载
供稿:网友

题目描述:

小明正在玩一个“翻硬币”的游戏。桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。比如,可能情形是:**oo***oooo如果同时翻转左边的两个硬币,则变为:oooo***oooo现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:  程序输入:两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000程序输出:一个整数,表示最小操作步数例如:用户输入:**********o****o****程序应该输出:5再例如:用户输入:*o**o***o****o***o**o***程序应该输出:1资源约定:峰值内存消耗 < 64MCPU消耗  < 1000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意: main函数需要返回0注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。

题目思路:

如果对应的第一个硬币状态不相同,不论对应的第二个硬币状态是否相同,都一定要翻转前两个硬币。

如果对应的第一个硬币状态相同,那么一定不会翻转第一个硬币,因此,当前面对应的硬币状态相同的时候,我们不必考虑,只需要考虑第一个不同的硬币的位置,将其翻转即可,当翻转相同后,同样不必考虑。 所以我们只需要从第一个硬币开始比较对应的状态,如果相同则跳过,如果不同则翻转本身和后面一个硬币,翻转后继续前一个步骤。

题目代码:

#include<cstdio>#include<iostream>#include<string>using namespace std;string s1,s2;int p1[1005],p2[1005];int ans=0;int main(){	cin>>s1>>s2;	//输入数据处理	for(int i=0 ;i<s1.length(); i++){		if(s1[i]=='*')p1[i]=1;		if(s1[i]=='o')p1[i]=-1;		if(s2[i]=='*')p2[i]=1;		if(s2[i]=='o')p2[i]=-1;			}	//进行翻转操作	for(int i=0 ;i<s1.length()-1 ;i++){		if(p1[i]!=p2[i]){			ans++;			p1[i] = -p1[i];			p1[i+1] = -p1[i+1];		}	}	cout<<ans<<endl;	return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表