問題描述ide
小明正在玩一個「翻硬幣」的遊戲。idea
桌上放着排成一排的若干硬幣。咱們用 * 表示正面,用 o 表示反面(是小寫字母,不是零)。spa
好比,可能情形是:**oo***oooo.net
若是同時翻轉左邊的兩個硬幣,則變爲:oooo***oooocode
如今小明的問題是:若是已知了初始狀態和要達到的目標狀態,每次只能同時翻轉相鄰的兩個硬幣,那麼對特定的局面,最少要翻動多少次呢?blog
咱們約定:把翻動相鄰的兩個硬幣叫作一步操做,那麼要求:遊戲
兩行等長的字符串,分別表示初始狀態和要達到的目標狀態。每行的長度<1000字符串
一個整數,表示最小操做步數。string
代碼來源: 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; 可得滿分。