題目連結:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1592
題目意思:
給一串-和o組成的字串,你可以把“-oo"變成”--o",可以把“oo-”變成“--o",問最後最少有多少個o.
解題思路:
採用記憶化搜素的方法,用map標記是否訪問過,用string的substr提取連續的三個字元,用string的replace得到替換後的字串。
代碼:
#include<iostream>#include<cmath>#include<cstdio>#include<cstdlib>#include<string>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<stack>#include<queue>#define eps 1e-6#define INF (1<<20)#define PI acos(-1.0)using namespace std;map<string,bool>mymap;int ans;void dfs(string cur){ if(mymap.find(cur)!=mymap.end()) //如果已經檢查了 return ; int len=cur.size(),num=0; for(int i=0;i<len;i++) //查看o的數量 if(cur[i]=='o') num++; if(num<ans) ans=num; mymap[cur]=true; //把目前狀態放到map裡 for(int i=0;i<=len-3;i++) { if(cur.substr(i,3)=="-oo") //如果有-oo出現,則可以調換 { string temp=cur; temp.replace(i,3,"o--"); dfs(temp); } if(cur.substr(i,3)=="oo-") { string temp=cur; temp.replace(i,3,"--o"); dfs(temp); } } return ;}int main(){ int n; scanf("%d",&n); string temp; while(n--) { map<string,bool>::iterator begin=mymap.begin(); map<string,bool>::iterator end=mymap.end(); mymap.erase(begin,end); //把當前的map清空 ans=INF; cin>>temp; dfs(temp); printf("%d\n",ans); } return 0;}