题意:已知两堆牌数均为n的纸牌堆a和b的初始状态, 按给定规则能将他们相互交叉组合成一堆牌str,再将str的最底下的n张牌归为a,最顶的n张牌归为b,依此循环下去。现在输入a和b的初始状态 以及 预想的最终状态c,问a, b经过多少次洗牌之后,最终能达到状态c,若永远不可能相同,则输出”-1”。

思路:用map记录一下当前str出现的状态,如果当前的str在前面出现过(出现循环),那就输出-1,因为无论再怎么变换都不会出现终态c。若果没有出现的话就继续洗牌然后分牌,一直到找出为止。

附带一个,string.append() 的用法:https://blog.csdn.net/wxn704414736/article/details/78551886

  • char数组的写法
#include<iostream>
#include<string>
#include<cmath>
#include<ctype.h>
#include<memory.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<iomanip>
#include<set>
#include<list>
#include<vector>
#include<stack>
#include<queue>
#define ll long long int
using namespace std;
const int maxn = 300;int main()
{int T; cin >> T;for (int ii = 1; ii <= T; ii++){char a[maxn], b[maxn], c[maxn * 2];char str[maxn * 2];map<string, int> Map; //Map.clear();int n; cin >> n;int cnt = 0;cin >> a >> b >> c;Map[c] = 1;while (true){int t = 0;for (int i = 0; i < n; i++){str[t++] = b[i];str[t++] = a[i];}str[t] = '\0';//千万不可以丢掉!!!cnt++;if (!strcmp(str, c)){cout << ii << " " << cnt << endl;break;}if (Map[str] == 1){cout << ii << " " << -1 << endl;break;}Map[str] = 1;for (int i = 0; i < n; i++)a[i] = str[i];for (int i = 0; i < n; i++)b[i] = str[i + n];a[n] = '\0';//千万不可以丢掉!!!b[n] = '\0';//千万不可以丢掉!!!}}return 0;
}
  • string的写法
#include<iostream>
#include<string>
#include<cmath>
#include<ctype.h>
#include<memory.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<iomanip>
#include<set>
#include<list>
#include<vector>
#include<stack>
#include<queue>
#define ll long long int
using namespace std;
const int maxn = 300;int main()
{int T; cin >> T;for (int ii = 1; ii <= T; ii++){string a, b, c;//string str;//写在这里就错了! 忘记改地方了,被坑了好久!map<string, int> Map;int n; cin >> n;int cnt = 0;cin >> a >> b >> c;Map[c] = 1;while (true){string str;int t = 0;for (int i = 0; i < n; i++){str += b[i];str += a[i];}cnt++;if (str == c){cout << ii << " " << cnt << endl;break;}if (Map[str] == 1)//如果出现过{cout << ii << " " << -1 << endl;break;}Map[str] = 1;a = str.substr(0, n);//a取上半部分b = str.substr(n, n);//b取下半部分}}return 0;
}

poj 3087 Shuffle'm Up 模拟(map记录)相关推荐

  1. POJ 3087 Shuffle'm Up (模拟+map)

    题目链接:http://poj.org/problem?id=3087 题目大意:已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块 ...

  2. 【POJ3126 Prime Path】【POJ 3087 Shuffle'm Up】【UVA 11624 Fire!】【POJ 3984 迷宫问题】

    POJ3126Prime Path 给定两个四位素数a  b,要求把a变换到b 变换的过程要 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数  与  前一步得到的素数  只能有一个位 ...

  3. POJ 3087 Shuffle'm Up DFS

    link:http://poj.org/problem?id=3087 题意:给你两串字串(必定偶数长),按照扑克牌那样的洗法(每次从S2堆底中拿第一张,再从S1堆底拿一张放在上面),洗好后的一堆可以 ...

  4. POJ 3087 Shuffle'm Up 线性同余,暴力 难度:2

    http://poj.org/problem?id=3087 设:s1={A1,A2,A3,...Ac} s2={Ac+1,Ac+2,Ac+3,....A2c} 则 合在一起成为 Ac+1,A1,Ac ...

  5. POJ 3087 Shuffle'm Up(水题)

    题目链接 蒙姐跟我说了题意,就很简单了,类似打扑克中的插牌.磕磕绊绊,终于把POJ第三次训练刷完了. 1 #include <cstdio> 2 #include <cstring& ...

  6. G - Shuffle‘m Up POJ - 3087

    G - Shuffle'm Up POJ - 3087 题意:洗牌,每次让两副牌依次合为一摞,每次s2的最后一张垫底,拆为两摞,下面一半为 s1,反复操作至出现目标情况,输出洗牌次数,如果出现重复,输 ...

  7. java过滤map去除重复数据,javascript模拟map输出与去除重复项的方法

    本文实例讲述了javascript模拟map输出与去除重复项的方法.分享给大家供大家参考.具体方法如下: 1.Javascriptmap输出 function Map(){ // private va ...

  8. pku 3087 Shuffle'm Up 说的是bfs,其实就是个模拟

    http://poj.org/problem?id=3087 刚看到题目的时候给我整蒙了,BFS怎么做啊?这不就是模拟一下洗牌的过程,如果遇到目标字符串就输出步数,如果回到原始串,就说明到不了目标串. ...

  9. 省选模拟赛记录(越往下越新哦~~~)

    LOG 模拟赛 第一次见尼玛这么给数据范围的-- 开考有点困,迷迷糊糊看完了三道题,真的是像老吕说的那样,一道都不会-- 思考T1,感觉有点感觉,但是太困了,就先码了暴力,发现打表可以50分,于是就大 ...

最新文章

  1. Linux下路由表调试工具traceroute
  2. 最先进的AI还不如动物聪明?首届AI-动物奥运会英国开赛!
  3. C#生成不重复的随机数
  4. 新零售赛道上,便利蜂的美食牌
  5. java有效索引范围_Java索引超出范围:0
  6. epoll内存计算方法:4G内存服务器epoll并发量最大能达到多少?
  7. clickhouse hbase性能对比_如何让 HBase 更快、更稳、更省钱
  8. mysql注入啥意思_【菜鸟学注入】之MySQL报错注入详解
  9. 算法训练 完数 C语言
  10. 现代支付系统的资金流向
  11. 计算机网络名怎么解决,指定的网络名不再可用怎么办解决教程
  12. vim显示缩进对齐线
  13. 安卓逆向_6 --- Dalvik 字节码、Smali 详解
  14. 杂谈(1)--人生必知的78种经典效应
  15. ctf夏季集训结训赛-简单题writeup
  16. 拼多多618来了:500余家官旗齐聚“品牌专场”,发放30亿消费红包
  17. 移动端iOS中input输入框搜索框软键盘出现换行而不是搜索
  18. python程序设计入门书籍推荐_python刚刚入门,接下来这几本python的书会让你成为别人眼里的大神!...
  19. MBA-day26 数的概念与性质
  20. 老李分享:JAVA性能监控工具

热门文章

  1. MyBatis拦截器实现分页
  2. 数据库自增主键用完了怎么办
  3. CTC 解码算法之 prefix beam search
  4. python 批量处理文件
  5. CentOS 7 常用命令集合
  6. [thinkphp 5.0源码阅读] 缓存(一)
  7. ASP.NET 前端Ajax获取数据并刷新
  8. 关于预编绎网站的问题[已预编译此应用程序的错误]
  9. 今日登陆sourceforge后发现的灵异现象
  10. IT人必读:写给浮躁的IT同仁