蓝桥杯 PREV-6 历届试题 翻硬币

历届试题 翻硬币

时间限制:1.0s   内存限制:256.0MB

问题描述

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

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

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

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

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

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

输入格式

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

输出格式

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

样例输入1

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

样例输出1

5

样例输入2

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

样例输出2

1

分析:本题事实上要保证输入的两个字符串能够存在合法解,则要初始状态和目标状态间的差别数为偶数。从第一个字符开始,若初始状态和目标状态对应的字符不一样,则反转该字符和下一个字符;否则不反转。

#include <stdio.h>
#include <string.h>

int main()
{
    char initial[1005] = { 0 };
    char goal[1005] = { 0 };

    scanf("%s", initial);
    scanf("%s", goal);

    int steps = 0;
    for (int i = 0; i < strlen(initial) - 1; ++i)
    {
        if (initial[i] != goal[i])
        {
            steps++;
            if (initial[i] == 'o')
                initial[i] = '*';
            else
                initial[i] = 'o';
            if (initial[i + 1] == 'o')
                initial[i + 1] = '*';
            else
                initial[i + 1] = 'o';
        }
    }
    printf("%d", steps);

    return 0;
}
发布了357 篇原创文章 · 获赞 46 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/liulizhi1996/article/details/104642559