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