题目描述
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:**oo***oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:**oo***oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币。那么对特定的局面,最少要翻动多少次呢?
我们约定,翻动相邻的两个硬币为一步操作。输入
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000
输出
一个整数,表示最小操作步数
样例输入 Copy
**********
o****o****
样例输出 Copy
5
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int main(){ 5 int hash[1000];//用来记录不同的字符所在的位置 6 memset(hash, 0, sizeof(hash)); 7 string s1, s2; 8 cin >> s1 >> s2; 9 for(int i = 0; i < s1.size(); i++){ 10 if(s1[i] != s2[i]){ 11 hash[i] = 1;//位置不同则计为1 12 } 13 } 14 int flag = -1; 15 int ans = 0; 16 for(int i = 0; i < s1.size(); i++){ 17 if(hash[i] == 1){ 18 if(flag == -1){ 19 flag = i;//记录第一个不同硬币的位置 20 }else{ 21 ans += i - flag;//将第二个硬币位置到第一个硬币位置加入反转次数集中 22 flag = -1; 23 } 24 } 25 } 26 cout << ans; 27 return 0; 28 }