题目描述
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:oo*oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作。
输入
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度< 1000
输出
一个整数,表示最小操作步数。
样例输入
ooo***
ooo***
样例输出
1
分析:
首先要找到那些位置的硬币是不相同的,然后对于不相同的两个硬币,如果两个硬币是相邻的话,那么我们只需要把他们翻动一次就行了,因为每一次只能翻动两个相邻的硬币,如果两个不同的硬币比相邻的话,我们就要从前一个开始,两个两个的往后翻动(第一次翻动第一个、第二个,第二次翻动第二个、第三个···)这样的话除了第一个和最后一个其他的反动的都是两次,硬币状态并没有改变,第一个和最后一个相反,这样就达到我们的目的。
代码:
#include <iostream>
#include<string.h>
using namespace std;
int main()
{
char str1[1000];
char str2[1000];
int bj[1000]; //记录两个字符串的比较结果,0为相同,1为不同。
while(cin>>str1)
{
cin>>str2;
int l;
int k=strlen(str1); //计算长度
for(int i=0;i<k;i++){ //比较两个字符串,并记录结果
if(str1[i]==str2[i])
bj[i]=0;
else
bj[i]=1;
}
int flag=-1; //记录标记位
int _count=0;
for(int i=0;i<k;i++)
{
if(bj[i]==1)
{ //检测到一个 1
if(flag==-1)
{ //如果前面没有记录的1的下标,记录当前1的下标
flag=i;
}
else
{ //如果前面有一个1了
_count+=i-flag;
flag=-1;
}
}
}
cout<<_count ;
}
return 0;
}