# 翻硬币
**问题描述**
小明正在玩一个“翻硬币”的游戏。
桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。
比如,可能情形是:`**oo***oooo`
如果同时翻转左边的两个硬币,则变为:`oooo***oooo`
现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:
**输入格式**
两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000
**输出格式**
一个整数,表示最小操作步数。
**样例输入1**
```
**********
o****o****
```
**样例输出1**
```
5
```
**样例输入2**
```
*o**o***o***
*o***o**o***
```
**样例输出2**
```
1
```
以下选项错误的是?
## aop
### before
```cpp
#include
using namespace std;
```
### after
```cpp
```
## 答案
```cpp
char a[1005], b[1005];
int len, i = 0, ans = 0;
int main()
{
scanf("%s%s", a, b);
len = strlen(a);
while (i < len)
{
if (a[i] != b[i])
{
a[i + 1] = (a[i + 1] == '*' ? '*' : 'o');
++ans;
}
++i;
}
printf("%d\n", ans);
}
```
## 选项
### A
```cpp
char a[1005], b[1005];
struct node
{
char ff[1005];
int step;
};
void bfs()
{
queue q;
node ll;
strcpy(ll.ff, a);
ll.step = 0;
q.push(ll);
while (!q.empty())
{
node tmp;
tmp = q.front();
q.pop();
if (!strcmp(tmp.ff, b))
{
printf("%d\n", tmp.step);
return;
}
int num = strlen(tmp.ff);
for (int i = 0; i < num - 1; i++)
{
node now;
now = tmp;
now.step++;
if (now.ff[i] == '*')
now.ff[i] = 'o';
else
now.ff[i] = '*';
if (now.ff[i + 1] == '*')
now.ff[i + 1] = 'o';
else
now.ff[i + 1] = '*';
q.push(now);
}
}
}
int main()
{
while (~scanf("%s", a))
{
scanf("%s", b);
bfs();
}
return 0;
}
```
### B
```cpp
int main()
{
string a;
string b;
cin >> a >> b;
int cnt = 0;
for (int i = 0; i < a.length(); i++)
{
if (a[i] != b[i])
{
if (a[i] == '*')
{
a[i] = 'o';
}
else
{
a[i] = '*';
}
if (a[i + 1] == '*')
{
a[i + 1] = 'o';
}
else
{
a[i + 1] = '*';
}
cnt++;
}
}
cout << cnt;
return 0;
}
```
### C
```cpp
int main()
{
string a, b;
cin >> a >> b;
int a1 = a.size(), b1 = b.size(), ans = 0;
for (int i = 0; i < a1; i++)
{
if (a[i] == b[i])
{
continue;
}
else
{
ans++;
a[i] = b[i];
if (a[i + 1] == '*')
{
a[i + 1] = 'o';
}
else
{
a[i + 1] = '*';
}
}
}
cout << ans << endl;
return 0;
}
```