蓝桥杯 1453 翻硬币 (找规律)

题目描述

小明正在玩一个“翻硬币”的游戏。 

桌上放着排成一排的若干硬币。我们用  *  表示正面,用  o  表示反面(是小写字母,不是零)。 

比如,可能情形是:oo*oooo 

如果同时翻转左边的两个硬币,则变为:oooo***oooo 

现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢? 

我们约定:把翻动相邻的两个硬币叫做一步操作。

输入

两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度< 1000 

输出

一个整数,表示最小操作步数。 

样例输入

ooo***

ooo***

样例输出

1

分析:

首先要找到那些位置的硬币是不相同的,然后对于不相同的两个硬币,如果两个硬币是相邻的话,那么我们只需要把他们翻动一次就行了,因为每一次只能翻动两个相邻的硬币,如果两个不同的硬币比相邻的话,我们就要从前一个开始,两个两个的往后翻动(第一次翻动第一个、第二个,第二次翻动第二个、第三个···)这样的话除了第一个和最后一个其他的反动的都是两次,硬币状态并没有改变,第一个和最后一个相反,这样就达到我们的目的。
代码:

    #include <iostream>
    #include<string.h>
      using namespace std;
      int main()
      {
          char str1[1000];
          char str2[1000];
          int bj[1000];    //记录两个字符串的比较结果,0为相同,1为不同。 
          while(cin>>str1)
          {
            cin>>str2;
             int l;
             int k=strlen(str1);    //计算长度 
             for(int i=0;i<k;i++){    //比较两个字符串,并记录结果 
                 if(str1[i]==str2[i])
                     bj[i]=0;
                 else
                     bj[i]=1;
             }
             int flag=-1;    //记录标记位 
             int _count=0;
             for(int i=0;i<k;i++)
             {
                 if(bj[i]==1)
                 {    //检测到一个 1 
                     if(flag==-1)
                     {    //如果前面没有记录的1的下标,记录当前1的下标 
                         flag=i;
                     } 
                     else
                     {    //如果前面有一个1了 
                         _count+=i-flag;
                         flag=-1;
                     }
                 }
             }
             cout<<_count ; 
         }
         return 0;
     }

转载于:https://www.cnblogs.com/cmmdc/p/6729615.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值