試験の質問前の試験の質問コインをめくる
リソース制限
制限時間:1.0秒メモリ制限:256.0MB
問題の説明
XiaoMingは「コイントス」ゲームをプレイしています。
テーブルの上に数枚のコインが並んでいます。*は表側を表し、oは裏側を表します(ゼロではなく小文字)。
たとえば、考えられる状況は次のとおりです。** oo *** oooo
左側の2枚のコインを同時に裏返すと、oooo *** ooooになります。
Xiaomingの質問は、初期状態と到達する目標状態がわかっていて、同時に2つの隣接するコインしか裏返すことができない場合、少なくとも特定の状況で何回裏返す必要があるかということです。
私たちは同意します:2つの隣接するコインを裏返すことはワンステップ操作と呼ばれ、要件は次のとおりです。
入力フォーマット
同じ長さの2つの文字列は、それぞれ初期状態と到達するターゲット状態を表します。各行の長さ<1000
出力フォーマット
操作ステップの最小数を表す整数。
サンプル入力1
**********
o **** o ****サンプル出力1
5
サンプル入力2
* o ** o *** o ***
* o *** o ** o ***サンプル出力2
1
アイデア:
2つの文字列s1とs2は、それぞれ2つの入力行を格納するために使用されます。
2つの文字列の違いを比較すると、結果は異なる場所の2つの添え字の違いであることがわかります。(わからない場合は、サンプル1と比較できます)
しかし、もっと複雑です。2つの入力の間に多くの違いがある場合、貪欲なアイデアを採用する必要があります。左から右に最初に遭遇した2つが最初に処理され、次に遭遇した2つが処理されます。瞬間。
実装コード:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int main()
{
int l;
char s1[1000],s2[1000];
int c[1000];
int i,j,k;
while(cin>>s1)
{
cin>>s2;
l=strlen(s1);
for(i=0;i<l;i++)
{
if(s1[i]==s2[i])
c[i]=0;
else
c[i]=1;
}
int f=-1;
int sum=0;
for(i=0;i<l;i++)
{
if(c[i]==1)
{
if(f==-1)
f=i;
else
{
sum+=i-f;
f=-1;
}
}
}
printf("%d\n",sum);
}
}