消黑棋的游戏,用字符串搜索做的。
题目大概意思是说,每次给你一条字符串,有黑又白,如果存在两个黑棋相连,旁边一个白棋的情况,那么可以挑一个黑棋,同时消中间的黑棋。问这样下去最少剩下几个黑棋。
用C++的字符串每次提取三个连续的字符,判断能否符合跳跃消去的条件,如果可以,跳跃并消去,然后接着继续搜索。
#include <iostream>
#include <map>
#include <string>
#define INF (1<<30)
using namespace std;
map<string,bool> m;
string s;
int ans=INF;
int getonum(string str)
{
int cnt=0;
for(int i=0;i<12;i++)
if(str[i]=='o')
cnt++;
return cnt;
}
void dfs(string str)
{
if(m.find(str)!=m.end())
return;
int num=getonum(str);
ans=ans>num?num:ans;
m[str]=true;
for(int i=0;i<10;i++)
{
if(str.substr(i,3)=="-oo")
{
string temp=str;
temp.replace(i,3,"o--");
dfs(temp);
}
if(str.substr(i,3)=="oo-")
{
string temp=str;
temp.replace(i,3,"--o");
dfs(temp);
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
ans=INF;
m.clear();
s.clear();
cin>>s;
dfs(s);
cout<<ans<<endl;
}
return 0;
}