2018藍橋杯|歷屆試題|翻硬幣

問題描述ide

小明正在玩一個「翻硬幣」的遊戲。idea

桌上放着排成一排的若干硬幣。咱們用 * 表示正面,用 o 表示反面(是小寫字母,不是零)。spa

好比,可能情形是:**oo***oooo.net

若是同時翻轉左邊的兩個硬幣,則變爲:oooo***oooocode

如今小明的問題是:若是已知了初始狀態和要達到的目標狀態,每次只能同時翻轉相鄰的兩個硬幣,那麼對特定的局面,最少要翻動多少次呢?blog

咱們約定:把翻動相鄰的兩個硬幣叫作一步操做,那麼要求:遊戲

輸入格式

兩行等長的字符串,分別表示初始狀態和要達到的目標狀態。每行的長度<1000字符串

輸出格式

一個整數,表示最小操做步數。string

樣例輸入1
**********
o****o****
樣例輸出1
5
樣例輸入2
*o**o***o***
*o***o**o***
樣例輸出2
1

 

代碼來源: http://blog.csdn.net/idealism_xxm/article/details/50392061io

代碼

#include <cstdio> #include <cstring>

using namespace std; char a[1005],b[1005]; int len,i=0,ans=0; int main() { scanf("%s%s",a,b); len=strlen(a); while(i<len) { if(a[i]!=b[i]) { a[i+1]=(a[i+1]=='*'?'o':'*'); ++ans; } ++i; } printf("%d\n",ans);
return 0; }

 

思路

很容易證實,一個字符串若是能夠經過翻轉相鄰兩個的字符變成另外一個字符串,則這兩個字符串一定有偶數(包括0)個字符不一樣

直接從頭開始碰見不一樣的字符,就翻轉下一個字符,沒必要擔憂最後一個字符會不一樣,這樣翻轉次數即爲最小。

關於測評

C++環境上述須要最後加上return 0; 可得滿分;C環境須要改頭文件c->.h ,去掉using namespace std; ,最後加上return 0; 可得滿分。

相關文章
相關標籤/搜索