翻硬币
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:**oo***oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作。
输入格式
两行等长的字符串,分别表示初始状态和要达到的目标状态。
输出格式
一个整数,表示最小操作步数
数据范围
输入字符串的长度均不超过100。
数据保证答案一定有解。
输入样例1:
**********
1
o****o****
1
输出样例1:
5
输入样例2:
*o**o***o***
1
*o***o**o***
1
输出样例2:
1
这种翻动的题目容易引起周围变化的,最好按照从上往下从左到右的顺序(例如费解的开关),会发现前一个势必引起下一个位置的变动,那么只要确认了前面,后面跟着比对修改即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int times;//记录次数
string start, fina;//初始和终止
int main() {
cin >> start >> fina;
for (int i = 0; i < start.size()-1; i++) {//两个两个从前往后扫描,注意-1
if (start[i] != fina[i]) {
times++;
if (start[i] == '*')start[i] = 'o';
else start[i] = '*';
if (start[i+1] == '*')start[i+1] = 'o';
else start[i+1] = '*';
}
}
cout << times;
}