记忆化搜寻 uva-10651-Pebble Solitaire
记忆化搜索 uva-10651-Pebble Solitaire
题目链接:
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; }