poj 3087
阿新 • • 發佈:2018-04-22
acm題意是給出2副牌堆,然後放置第二副牌的最下面的一張,再疊放第一副牌最下面的一張,然後依照此順序疊放2個牌堆最下面的一張牌,直至成為一副新的牌。之後下半部分和上半部分成為新的2副牌。然後給出一副合成牌的順序,如果可以通過疊堆得到所要的順序,就輸出疊堆次數。若不可以,則輸出-1。
參考:http://www.cnblogs.com/ouyangduoduo/archive/2013/06/01/3112518.html
模仿疊堆過程,然後用map記錄合成排隊是否出現過,若出現過則說明會產生循環,輸出-1。若模擬結果符合順序,則輸出次數。
#include<iostream> #include<map> #include<string> using namespace std; string str1,str2,str3,str12; map<string,int> result; int num; void moni(){ int cnt=0; result.clear(); while(1){ cnt++; str12.clear(); for(int i=0;i<num;i++){ str12+=str2[i]; str12+=str1[i]; } if(!result[str12]){ result[str12]++; } else{ cout<<"-1"<<endl; break; } if(str12==str3){ cout<<cnt<<endl; break; } str1.clear(); str2.clear(); for(int i=0;i<num;i++){ str1+=str12[i]; } for(int i=num;i<num*2;i++){ str2+=str12[i]; } } } int main(){ int cnt=0,n; cin>>n; while(n--){ cin>>num>>str1>>str2>>str3; cout<<++cnt<<" "; moni(); } return 0; }
poj 3087