C ++フリップコイン(再帰)

XiaoMingは「コインフリップ」ゲームをプレイしています。

テーブルの上にいくつかのコインが並んでいます。*を使用して前面を表し、oを使用して背面を表します(ゼロではなく小文字)。

たとえば、考えられる状況は次のとおりです。**oo***oooo

左側の2つのコインを同時に裏返すと、次のようになります。oooo***oooo

Xiao Mingの質問は、初期状態と到達する目標状態がわかっていて、同時に2つの隣接するコインしかフリップできない場合、特定の状況でフリップが最も少ない回数は何回ですか。

私たちは同意します:2つの隣接するコインを回すことはワンステップ操作と呼ばれます。

入力フォーマット

同じ長さの2つの文字列は、初期状態と到達するターゲット状態を表します。

出力フォーマット

操作ステップの最小数を表す整数

データ範囲

入力文字列の長さは100を超えません。
データは、答えが解決可能でなければならないことを保証します。

入力例1:

**********
o****o****

サンプル出力1:

5

入力例2:

*o**o***o***
*o***o**o***

出力サンプル2:

1

ACコード:

#include<iostream>

using namespace std;

char a[110];//原串
char b[110];//目标串
int length;//串长度
int ans;//答案

void turn(int x)//翻位于x处的硬币
{
    if(a[x]=='*') a[x]='o';
    else a[x]='*';
}

int main()
{
    cin>>a;
    cin>>b;
    int i=0;
    while(a[i]!='\0')//计算串长度
    {
        ++length;
        ++i;
    }
    for(int j=0;j<length-1;++j)//推导步骤,如果当前位和目标串不同,就需要翻转
    {
        if(a[j]!=b[j]){turn(j);turn(j+1);++ans;}
    }
    cout<<ans<<endl;
    return 0;
}

 

おすすめ

転載: blog.csdn.net/qq_44643644/article/details/108784384