C ++中的Zuma游戏

让我们考虑一下祖玛游戏。假设我们在桌子上有一排球,这些球的颜色分别为红色(R),黄色(Y),蓝色(B),绿色(G)和白色(W)。我们也有几个球。

现在,每次我们都可以从侧面选择一个球,然后将其插入行中。然后,如果有一组3个或以上相同颜色的球,则将其除去。继续这样做,直到无法取出更多球为止。

我们必须找到要插入的最小球,以删除桌子上的所有球。如果我们不能去除所有球,则返回-1。

因此,如果输入像“ WRRBBW”,而我们有“ RBW”,则答案将为3。我们可以在RR之后添加R,(WRR [R] BBW),删除后,序列将为(WBBW),然后添加B,因此(WBB [B] W),删除后将为(WW),然后添加W,因此序列将为(WW [W])。这将删除所有球。

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个函数findMinStep(),这将花费s,

  • s:= s连接“#”

  • 定义大小为26的数组v

  • 对于初始化i:= 0,当i <手的大小,更新(将i增加1)时,执行-

    • 将v [hand [i]-'A']增加1

  • ret:=调用函数solve(s,v)

  • 返回ret> =如果INF不为零,则使用-1进行检查,否则使用ret

  • 定义一个函数solve(),它将使用s,数组v,

  • 如果s与“#”相同,则-

    • 返回0

  • ret:= INF

  • 对于初始化i:= 0,j:= 0,当j <s的大小时,更新(j增加1),-

    • v [x-'A'] = v [x-'A']-需要

    • ret:= ret的最小值,需要+ solve(s的子串从0到第i个索引)将s的子串从j串联到s的大小– j,v

    • v [x-'A'] = v [x-'A'] +需要

    • 忽略以下部分,跳至下一个迭代

    • 如果s [i]与s [j]相同,则-

    • 需要:= 3-(j-i)

    • x:= s [i]

    • 如果需要<= v [x-'A'],则-

    • i:= j

    • 调用函数过程

    • 如果s与“#”相同,则-

      • 返回0

    • 对于初始化i:= 0,j:= 0,当j <s的大小时,更新(j增加1),-

      • v [x-'A'] = v [x-'A']-需要

      • ret:= ret的最小值,需要+ solve(s的子串从0到第i个索引)将s的子串从j串联到s的大小– j,v

      • v [x-'A'] = v [x-'A'] +需要

      • 忽略以下部分,跳至下一个迭代

      • 如果s [i]与s [j]相同,则-

      • 需要:= 3-(j-i)

      • x:= s [i]

      • 如果需要<= v [x-'A'],则-

      • i:= j

      • 返回ret

      • 定义一个函数process(),它需要s,

      • 对于初始化i:= 0,j:= 0,当j <s的大小时,更新(j增加1),-

        • i:= j

        • 从s删除i,j-i

        • j:= i-1

        • 忽略以下部分,跳至下一个迭代

        • 如果s [i]与s [j]相同,则-

        • 如果(j-i)> = 3,则-

        • 除此以外

        • 用两个字符串调用findMinStep()以获取答案

        让我们看下面的实现以更好地理解-

        示例

        #include <bits/stdc++.h>
        using namespace std;
        const int INF = 1e9;
        class Solution {
        public:
           int findMinStep(string s, string hand) {
              s += "#";
              vector <int> v(26);
              for(int i = 0; i < hand.size(); i++){
                 v[hand[i] - 'A']++;
              }
              int ret = solve(s, v);
              return ret >= INF ? -1 : ret;
           }
           int solve(string s, vector <int>& v){
              if(s == "#") return 0;
              int ret = INF;
              for(int i = 0, j = 0; j < s.size(); j++){
                 if(s[i] == s[j]) continue;
                 int need = 3 - (j - i);
                 char x = s[i];
                 if(need <= v[x - 'A']){
                    v[x - 'A'] -= need;
                    ret = min( ret, need + solve(s.substr(0,i) + s.substr(j , s.size() - j), v));
                    v[x - 'A'] += need;
                 }
                 i = j;
              }
              process(s);
              if(s == "#") return 0;
              for(int i = 0, j = 0; j < s.size(); j++){
                 if(s[i] == s[j]) continue;
                 int need = 3 - (j - i);
                 char x = s[i];
                 if(need <= v[x - 'A']){
                    v[x - 'A'] -= need;
                    ret = min( ret, need + solve(s.substr(0,i) + s.substr(j , s.size() - j), v));
                    v[x - 'A'] += need;
                 }
                 i = j;
              }
              return ret;
           }
           void process(string& s){
              for(int i = 0, j = 0; j < s.size(); j++){
                 if(s[i] == s[j]) continue;
                 if((j - i) >= 3){
                    s.erase(i, j - i);
                    j = i - 1;
                 } else i = j;
              }
           }
        };
        main(){
           Solution ob;
           cout << (ob.findMinStep("WRRBBW", "RBW"));
        }

        输入值

        "WRRBBW", "RBW"

        输出结果

        3