UVA 10651 Pebble Solitaire

消黑棋的游戏,用字符串搜索做的。

题目大概意思是说,每次给你一条字符串,有黑又白,如果存在两个黑棋相连,旁边一个白棋的情况,那么可以挑一个黑棋,同时消中间的黑棋。问这样下去最少剩下几个黑棋。

用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;
}


你可能感兴趣的:(UVA 10651 Pebble Solitaire)