题目描述

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

桌上放着排成一排的若干硬币。我们用  *  表示正面,用  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;
     }
posted on 2017-04-18 19:50  渡……  阅读(899)  评论(1编辑  收藏  举报