acwing蓝桥杯 1208.翻硬币 模拟

183 阅读1分钟

image.png 如下为题目给的样例:

image.png

思想:模拟

起始状态和最终状态的长度一样,题目要求我们每次翻转两个硬币,最终达到最终状态。

因为本题一次可以翻两个硬币,所以改变硬币自身的状态不仅可以通过硬币自身更改,还可以通过相邻的硬币来改变状态。而硬币只有正反两种状态,如果翻一次状态不相同翻两次一定可以相同

我们可以递推一下:

image.png

image.png

image.png

image.png

image.png

我们发现经过我们的递归,五次就把样例的起始状态翻转成了最终状态

结论:我们只要发现起始状态前后两个状态不一样就把它们翻一面,直到起始状态和最终状态一样时就不再翻了。因为题目告诉我们最后一定有解,所以起始状态最后一定可以翻为和最终状态一个样。 ps:本题只有一种翻法。虽然题目要求我们输出一个最小次数翻法,像这种最小解什么的,一般都存在一个最优解,但是这道题只有一种翻法。

我们可以写如下代码: image.png

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;
}