題目背景
小明正在玩一個“翻硬幣”的游戲。
題目描述
桌上放著排成一排的若干硬幣。我們用?*
?表示正面,用?o
?表示反面(是小寫字母,不是零),比如可能情形是?**oo***oooo
,如果同時翻轉左邊的兩個硬幣,則變為?oooo***oooo
。現在小明的問題是:如果已知了初始狀態和要達到的目標狀態,每次只能同時翻轉相鄰的兩個硬幣,那么對特定的局面,最少要翻動多少次呢?
輸入格式
兩行等長字符串,分別表示初始狀態和要達到的目標狀態,每行長度小于?1000。
數據保證一定存在至少一種方案可以從初始狀態和要達到的目標狀態。
輸出格式
一個整數,表示最小操作步數。
輸入輸出樣例
輸入 #1復制
********** o****o****
輸出 #1復制
5
輸入 #2復制
*o**o***o*** *o***o**o***
解析:這題用的知識就是兩個等長字符串的匹配問題,博主本來看解析審題不認真,還以為每個數據只會有一段需要翻硬幣匹配,結果就出現了下面的錯誤代碼(樣例都是只有一段需要匹配,所以樣例都過了但是一測0分,好險,還好不是正式比賽)
#include<bits/stdc++.h>
using namespace std;
int main()
{string stand;cin>>stand;string nu;cin>>nu;int cnt=0;for(int i=0;i<stand.size();i++){if(nu[i]!=stand[i]){if(nu[i+1]!=stand[i+1]){cnt++;cout<<cnt;return 0;//因為我以為只需要一段,處理完直接結束代碼}else{if(nu[i+1]=='*'){cnt++;nu[i+1]='o';}else if(nu[i+1]=='o'){cnt++;nu[i+1]=='*';}}}}return 0;
}
?自己想了許久還沒想出來,最后還是問舍友才解決了的,其實也簡單,就是需要把串全部遍歷了,不能提前結束
#include<bits/stdc++.h>
using namespace std;
int main()
{string stand;cin>>stand;string nu;cin>>nu;int cnt=0;for(int i=0;i<stand.size();i++){if(nu[i]!=stand[i])//檢測到不同開始翻硬幣{nu[i+1]=(nu[i+1]=='*'?'o':'*');//因為遍歷過的硬幣不需要再用到,所以直接翻下一個就行,建議不會這種“ == ? : ” 寫法的學習一下,有時候能很大地精簡代碼cnt++;}}cout<<cnt;return 0;//修改之后發現,原來正確的代碼比我的錯誤代碼還要精簡很多
自我檢討,尤其是藍橋這種比賽制度,不怕題目簡單,就怕自己掉以輕心