如下为题目给的样例:
思想:模拟
起始状态和最终状态的长度一样,题目要求我们每次翻转两个硬币,最终达到最终状态。
因为本题一次可以翻两个硬币,所以改变硬币自身的状态不仅可以通过硬币自身更改,还可以通过相邻的硬币来改变状态。而硬币只有正反两种状态,如果翻一次状态不相同翻两次一定可以相同
我们可以递推一下:
我们发现经过我们的递归,五次就把样例的起始状态翻转成了最终状态。
结论:我们只要发现起始状态的前后两个状态不一样就把它们翻一面,直到起始状态和最终状态一样时就不再翻了。因为题目告诉我们最后一定有解,所以起始状态最后一定可以翻为和最终状态一个样。
ps:本题只有一种翻法。虽然题目要求我们输出一个最小次数翻法,像这种最小解什么的,一般都存在一个最优解,但是这道题只有一种翻法。
我们可以写如下代码:
code
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
char start[N],finished[N];
int n;
void reverse(int i)
{
if(start[i]=='*')start[i]='o';
else start[i]='*';
}
int main()
{
cin>>start>>finished;
n=strlen(start);
int res=0;
for(int i=0;i<n-1;i++)
{
if(start[i]!=finished[i])
{
reverse(i),reverse(i+1);
res++;
}
}
cout<<res<<endl;
return 0;
}