翻硬币

问题 J: 翻硬币

时间限制: 1 Sec  内存限制: 128 MB
提交: 19  解决: 3
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 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 }

 

posted @ 2019-03-20 14:54  kakaluotedj  阅读(201)  评论(0编辑  收藏  举报