蓝桥杯/翻转 /c++/c

问题描述

    小蓝用黑白棋的n个棋子排成一行,他在脑海里想象出了一个长度为n的01串T,他发现如果把黑棋当作1,白棋当作0,这一行棋子也是一个长度为n的01串S。

    小兰决定,如果在S中发现一个棋子和他两边的棋子都不一样,就可以将其翻转变成另一个颜色。也就是说,如果S中存在字串101或010,就可以选择将其变成111和000,这样的操作可以无限重复。

    小蓝想知道最少翻转多少次可以把S变成和T一模一样

输入格式

    输入包含多组数据。输入的第一行包含一个正整数D包括数据组数/

     后面2D行每行包含一个01串,每两行为一组数据,第2i-1 行为第i组数据的Ti,第2i行为第i组数据的Si, Si 和Ti 长度均为ni .

输出格式

     对于每组数据,输出一行包含一个整数,表示答案,如果答案不存在请输入 -1 

样例输入 

2
1000111
1010101
01000
11000


样例输出
2
-1

 解题思路

1.对于每一个不同的字符,根据题意他需要和两边的字符都不同才可以翻转,如果相同,那么无法进行翻转,输出-1即可

2.对于首字母和尾字母,由于左右两边缺少字符,所以一定无法比较,若不同,直接输出-1 即可

3.可以将s改成t的样例,直接输出操作步骤res即可

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
using namespace std;
const int N=1e6+10;
char s[N],t[N];
int main()
{
    int T;
    cin>>T;
    while(T--)
    { 
        scanf("%s%s",t,s);     //接受两个字符串
        int n=strlen(s);      //记录字符串的个数

        int res=0;
        rep(i,0,n)
        {      
           if(s[i]!=t[i])   //字符串不想等,需要改变
             //无法改变时
              if(!i || i==n-1 || s[i]==s[i-1] || s[i]==s[i+1])
               {
                   res=-1;
                   break;
               }
               else
               {
                   res++;
                   s[i]=t[i];
               }
         }
              printf("%d\n",res);
     }
     return 0;
}
            

 法2:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int d;  cin>>d;
    for(int i=0;i<d;i++)
    {
        string t,s;
        cin>>t>>s;
        int ans=0;
        for(int j=1;j<s.length();j++)
         {
             if(s[j-1]==s[j+1])    //比较j字符串两边是否相等
              {
                if(s[j]!=s[j+1])   //j字符串与他们不相等
                 {
                    if(t[j]!=s[j])    //与原字符串相比较
                    {
                         s[j]=t[j];
                          ans++;
                    }
                  }
               }
           }
          if(s.compare(t))            //比较整个字符串
            cout<<-1<<endl;
          else
            cout<<ans<<endl;
         }
     return 0;
   }
    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值