ブルーブリッジカップのテストの質問以前のテストの質問コインを回す(c ++)

試験の質問前の試験の質問コインをめくる

この質問の   評価記録を提出してください  

リソース制限

制限時間: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);
	 } 
}

 

おすすめ

転載: blog.csdn.net/with_wine/article/details/114408857