zoukankan      html  css  js  c++  java
  • 488. 祖玛游戏 力扣(困难) dfs

    488. 祖玛游戏

    你正在参与祖玛游戏的一个变种。

    在这个祖玛游戏变体中,桌面上有 一排 彩球,每个球的颜色可能是:红色 'R'、黄色 'Y'、蓝色 'B'、绿色 'G' 或白色 'W' 。你的手中也有一些彩球。

    你的目标是 清空 桌面上所有的球。每一回合:

    从你手上的彩球中选出 任意一颗 ,然后将其插入桌面上那一排球中:两球之间或这一排球的任一端。
    接着,如果有出现 三个或者三个以上 且 颜色相同 的球相连的话,就把它们移除掉。
    如果这种移除操作同样导致出现三个或者三个以上且颜色相同的球相连,则可以继续移除这些球,直到不再满足移除条件。
    如果桌面上所有球都被移除,则认为你赢得本场游戏。
    重复这个过程,直到你赢了游戏或者手中没有更多的球。
    给你一个字符串 board ,表示桌面上最开始的那排球。另给你一个字符串 hand ,表示手里的彩球。请你按上述操作步骤移除掉桌上所有球,计算并返回所需的 最少 球数。如果不能移除桌上所有的球,返回 -1 。

    示例 1:

    输入:board = "WRRBBW", hand = "RB"
    输出:-1
    解释:无法移除桌面上的所有球。可以得到的最好局面是:
    - 插入一个 'R' ,使桌面变为 WRRRBBW 。WRRRBBW -> WBBW
    - 插入一个 'B' ,使桌面变为 WBBBW 。WBBBW -> WW
    桌面上还剩着球,没有其他球可以插入。

    题解:https://leetcode-cn.com/problems/zuma-game/solution/acmjin-pai-ti-jie-dfsmei-ju-bian-cheng-x-30qj/

    感觉代码还有问题,应该是数据还不够角落的问题。

    代码:

    class Solution {
    public:
        map<char,int> mp;
        char dict[5]={'R','Y','B','G','W'};
        int ans;
        unordered_map<string,int> vis; // 记忆化搜索的核心,但是感觉缺少了hand的信息
        string cutstr(string s)
        {
           int i;
           bool flag=1;
           while(flag)
           {
               flag=0;
               i=0;
               while(i<s.length())
               {
                   int j=i;
                   while(j<s.length() && s[i]==s[j]) j++;
                   if(j-i>=3) {s=s.substr(0,i)+s.substr(j); flag=1; break;}
                   i=j;
               }
           }
           return s;
           /*
            bool flag = true;
            while (flag) {
                flag = false;
                for (int i = 0, j = 0; i < s.size(); i = j) {
                    while(j < s.size() && s[i] == s[j])
                        ++j;
                    if (j - i >= 3) {
                        s = s.substr(0, i) + s.substr(j);
                        flag = true;
                        break;
                    }
                }
            }
            return s;*/
        }
        void dfs(string str,int step)
        {
            if(step>=ans) return;
            if(str.length()==0) { ans=min(ans,step); return;}
            
            
            for(int i=0;i<5;i++)
            {
                if(mp[dict[i]]==0) continue;
                for(int j=0;j<str.length();j++)
                {
                    // string nxtstr=str.substr(0,j)+dict[i]+str.substr(j,str.length()-j);
                    string nxtstr=str.substr(0,j)+dict[i]+str.substr(j);
                    if(vis[nxtstr]>0) continue;
                    vis[nxtstr]=1;
                    nxtstr=cutstr(nxtstr);
                    mp[dict[i]]--;
                    dfs(nxtstr,step+1);
                    mp[dict[i]]++;
                }
            }
            return;
        }
        int findMinStep(string board, string hand) {
    
            for(auto ch:hand)  mp[ch]++;
            board=cutstr(board);
            ans=10;
            dfs(board,0);
            return ans==10?-1:ans;
        
        }
    };
  • 相关阅读:
    ext4.2常用的几种弹框
    oracle的批量操作sql语句
    ztree异步加载树节点
    shiro接口对象介绍
    jquery记住密码
    整合ssm框架
    redis中 Could not get a resource from the pool 异常解决
    redis的安装
    centos下tomcat的安装
    centos下MySQL的安装
  • 原文地址:https://www.cnblogs.com/stepping/p/15535797.html
Copyright © 2011-2022 走看看