1 条题解
-
0
题目解析
题意分析
这道题目模拟了扑克筹码的洗叠过程,要求计算从初始堆 和 通过特定洗牌规则重组后,达到目标 所需的最少洗牌次数。具体规则如下:
-
初始状态:
- 两个筹码堆 和 ,每堆包含 个筹码()
- 每个筹码用大写字母 - 表示颜色
-
洗牌规则:
- 新建空堆 (最终包含 个筹码)
- 交替从 和 的最底层开始取筹码:
- 第 次操作():
- 第 次操作():
-
重组规则:
- 每次洗牌后,将 拆分为:
- 新 :取 前 个筹码(底层)
- 新 :取 后 个筹码(顶层)
- 每次洗牌后,将 拆分为:
-
目标:
- 判断经过多少次洗牌后, 能等于目标序列
- 若无法达成目标,则输出
解题思路
-
模拟洗牌过程:
- 根据洗牌规则,每次洗牌生成新的 序列
- 将 拆分为新的 和 用于下一次洗牌
-
检测循环:
- 使用集合记录每次洗牌后的 和 状态
- 如果状态重复出现,说明进入无限循环,无法达成目标
-
终止条件:
- 当前 等于目标序列时,返回洗牌次数
- 若洗牌次数超过 次仍未达成目标,则认为无法达成
#include<string.h> #include<string> #include<queue> #include<cstdio> #include<algorithm> #include<iostream> using namespace std; string a,b,target; int num; int dfs(string s1,string s2,int step){ if(s1+s2==target) return step; string temp=""; for(int i=0;i<num;i++) temp=temp+s2[i]+s1[i]; s1=temp.substr(0,num); s2=temp.substr(num,num); if(s1.compare(a)==0&&s2.compare(b)==0) return -1; else return dfs(s1,s2,step+1); } int main() { int Case; cin>>Case; for(int T=1;T<=Case;T++){ cin>>num>>a>>b>>target; cout<<T<<' '<<dfs(a,b,0)<<endl; } return 0; }
-
- 1
信息
- ID
- 2088
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者