ZOJ - 3983 - Crusaders Quest(思維 + 暴力)
阿新 • • 發佈:2018-10-02
代碼 連續 std -- ios 補齊 思路 iostream aaa
題意:
給出一個字符串,長度為9,包含三種各三個字母"a","g","o",如果一次消除連續三個一樣的分數+1,消完自動向左補齊
其中可以消去任意字母,以求得更大的分數
思路:
1、如果能夠消去兩個xxx那麽一定能消去第三個,那麽答案為3
2、如果只能找到一個xxx,那麽答案一定是 2,因為必須舍棄一個消除才能得到一組xxx
3、沒有找到xxx,那麽有兩種情況,一種是1,一種是2,枚舉三個字母,暴力刪除後進行判斷xxx的存在,如果存在,那麽答案是2,不存在答案是1
代碼:
#include<iostream> #include<string> using namespace std; string sss[4] = {"ggg", "ooo", "aaa"}; string s[4] = {"g","o","a"}; int deal(string str, int sum) { int t = 4; while(t--) { for(int i = 0; i <= 2; i++) { int index = str.find(sss[i]); if(index != -1) { str = str.substr(0,index)+str.substr(index+3,str.size()); sum ++; } } } return sum; } int del(string str) { int ans = -1; for(int i = 0; i <= 2; i++) { string tmp = str; int index = tmp.find(s[i]); while(index != -1) { tmp = tmp.substr(0,index)+tmp.substr(index+1,tmp.size()); index = tmp.find(s[i]); } ans = max(deal(tmp,0), ans); } if(ans == 0) return 1; else return ans; } int main() { string str; int t; cin >> t; while(t--) { cin >> str; int sum = deal(str, 0); if(sum == 3) cout << "3" << endl; else if(sum == 1) cout << "2" << endl; else cout << del(str) << endl; } return 0; }
ZOJ - 3983 - Crusaders Quest(思維 + 暴力)