题目:翻硬币
题目描述
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:** oo***oooo
如果同时翻转左边的两个硬币,则变为:oooo***oooo
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作。
输入
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度< 1000
输出
一个整数,表示最小操作步数。
样例输入
xoxxoxxxoxxx
xoxxxoxxoxxx
样例输出
1
思路
- 考虑两个字符串之间的差异,不同用1表示,相同用0表示,存在res数组中
- 问题转化为~如何将最邻近但不相邻的两个1,通过与相邻的0交换,成为一对相邻的1
- 扫一遍数组res,遇到单独的1就交换,直到配对成功,消去。遍历数组一遍,同时计数。
代码
#include<iostream>
#include<string>
using namespace std;
int res[10000];
int step;
int main()
{
string str1,str2;
cin >> str1 >> str2;
int len = str1.length();
for(int i=0;i<len;i++){
if(str1[i]!=str2[i]){
res[i] = 1;
}
}
for(int i=0;i<len;i++){
if(res[i]==1){
if(res[i+1]==1){
res[i]=0;
res[i+1]=0;
step++;
}else{
swap(res[i],res[i+1]);
step++;
}
}
}
cout << step;
return 0;
}
注
- 可以用dfs,bfs
- 简化题目给出得例子,再找规律