小明正在玩一个“翻硬币”的游戏。

桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。

比如,可能情形是:**oo***oooo

如果同时翻转左边的两个硬币,则变为:oooo***oooo

现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?

我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:

程序输入:

两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000

程序输出:

一个整数,表示最小操作步数

例如:

用户输入:

**********
o****o****

程序应该输出:

5

再例如:

用户输入:

*o**o***o***
*o***o**o***

程序应该输出:

1

资源约定:

峰值内存消耗 < 64M

CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0

注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。

注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

 

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s[1001];
int a[2][1001];
int main() {
    int len;
    for(int i = 0;i < 2;i ++) {
        scanf("%s",s);
        len = strlen(s);
        for(int j = 0;j < len;j ++) {
            if(s[j] == '*') a[i][j] = 1;
            else a[i][j] = -1;
        }
    }
    int c = 0;
    for(int i = 0;i < len;i ++) {
        if(a[0][i] != a[1][i]) {
            c ++;
            a[0][i] *= -1;
            a[0][i + 1] *= -1;
        }
    }
    printf("%d",c);
}

 

import java.util.Scanner;

public class Main {
    private static Scanner sc = new Scanner(System.in);
    private static char reverse(char ch) {
        if(ch == '*') return 'o';
        else return '*';
    }
    public static void main(String[] args) {
        String s1,s2;
        StringBuilder s;
        s1 = sc.next();
        s2 = sc.next();
        int c = 0;
        s = new StringBuilder(s1);
        for(int i = 0;i < s.length();i ++) {
            if(s.charAt(i) != s2.charAt(i)) {
                s.setCharAt(i,reverse(s.charAt(i)));
                if(i + 1 < s.length()) s.setCharAt(i + 1, reverse(s.charAt(i + 1)));
                c ++;
            }
        }
        System.out.println(c);
    }

}