【模拟】POJ 3087
题意:一开始没怎么看明白,注意现是从S2里拿牌放在最底下,再放S1,这样交叉放(我一开始以为是S1和S2随意哪个先放,分别模拟取最小),然后在从中间截一半,下半部给组成新的S1,上半部组成新的S2。然后再交叉洗牌,重复,问达到给出的S12最小的洗牌次数。
思路:题意懂了直接模拟就行,无法到达的情况就是某一次洗牌出来的S12和之前出现过的S12重合了,也就是形成了循环,此时无法达到给出的S12的情况那就是不可能了。判重没想到什么特别巧妙的方法就用了map。
另外这道题的数据似乎超了点,开到500+比较好。
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
const int maxn = 5000+5;
char s1[maxn];
char s2[maxn];
char S12[maxn*10];
char ss[maxn*10];
int len;
bool check(char a[],char b[]){
if(strlen(a)!=strlen(b)) return false;
for(int i=0;i<strlen(a);i++){
if(a[i]!=b[i])
return false;
}
return true;
}
int solve(char S1[],char S2[]){
int ans = 0;
int lenc = 0;
map<string,int>M;
while(1){
ans++;
int cnt=0;
memset(ss,'\0',sizeof(ss));
for(int i=0;i<len;i++){
ss[cnt++] = S2[i];
ss[cnt++] = S1[i];
}
//printf("CNT = %d,LEN = %d\n",cnt,strlen(ss));
ss[cnt] = '\0';
//printf("%s\n",ss);
if(check(ss,S12)) return ans;
string a = ss;
if(!M[a])
M[a]++;
else return -1;
for(int i=0;i<len;i++){
S1[i] = ss[i];
S2[i] = ss[len+i]; //模拟题WA只告诉了我们一件事 仔细读题
}
S1[len] = '\0';
S2[len] = '\0';
//printf("%s\n",S1);
//printf("%s\n",S2);
}
return -1;
}
void init(){
memset(s1,'\0',sizeof(s1));
memset(s2,'\0',sizeof(s2));
memset(S12,'\0',sizeof(S12));
memset(ss,'\0',sizeof(ss));
}
int main()
{
int N;
int m=0;
scanf("%d",&N);
while(N--){
init();
scanf("%d",&len);
getchar();
gets(s1);
//printf("%s\n",S1);
gets(s2);
//printf("%s\n",S2);
gets(S12);
//printf("%s\n",S12);
//solve();
printf("%d %d\n",++m,solve(s1,s2));
}
return 0;
}
【模拟】POJ 3087的更多相关文章
- POJ.3087 Shuffle'm Up (模拟)
POJ.3087 Shuffle'm Up (模拟) 题意分析 给定两个长度为len的字符串s1和s2, 接着给出一个长度为len*2的字符串s12. 将字符串s1和s2通过一定的变换变成s12,找到 ...
- POJ 3087 Shuffle'm Up
Shuffle'm Up Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- POJ 3087 Shuffle'm Up(洗牌)
POJ 3087 Shuffle'm Up(洗牌) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 A common pas ...
- DFS POJ 3087 Shuffle'm Up
题目传送门 /* 题意:两块扑克牌按照顺序叠起来后,把下半部分给第一块,上半部给第二块,一直持续下去,直到叠成指定的样子 DFS:直接模拟搜索,用map记录该字符串是否被搜过.读懂题目是关键. */ ...
- POJ 3087 Shuffle'm Up (模拟+map)
题目链接:http://poj.org/problem?id=3087 题目大意:已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块 ...
- poj 3087 Shuffle'm Up ( map 模拟 )
题目:http://poj.org/problem?id=3087 题意:已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块牌归为s ...
- POJ - 3087 模拟 [kuangbin带你飞]专题一
模拟洗牌的过程,合并两堆拍的方式:使先取s2,再取s1:分离成两堆的方式:下面C张放到s1,上面C张到s2.当前牌型与第一次相同时,说明不能搜索到答案. AC代码 #include<cstdio ...
- poj 3087 Shuffle'm Up (模拟过程)
Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuff ...
- Shuffle'm Up POJ - 3087(模拟)
Shuffle'm Up Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15249 Accepted: 6962 Des ...
随机推荐
- phalcon3.0.1默认多模块生成的几个bug
发现用Phalcon DevTools (3.0.0)生成的多模块有一些bug: 默认的路由定义,字符串替换有误 原代码// $namespace = str_replace('Module','Co ...
- 创建table并实现ID自增长
① create table p_user( id number(10) not null primary key, name varchar2(3 ...
- PYTHON 写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者
def a3(arg): ret = [ ] for i in range(len(arg)): if i % 2 == 1: ret.append(arg[i]) else: pass return ...
- Qt拖拽界面 (*.ui) 缩放问题及解决办法
问题 使用Qt Designer 设计的界面,在缩放的时候不能随着主窗口一起缩放. 解决办法 之前遇到这个问题的时候,都是直接重写resizeEvent接口来实现的,在自动生成的Ui_Widget或U ...
- XCode8向ITunes提交版本,不显示或提示无效的版本
主要是iOS10,对隐私权限有了新的要求.在info.plist里加入如下代码. <key>NSCameraUsageDescription</key> <string& ...
- html5 canvas-变幻函数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Mac下配置Apache + Php + Mysql环境
Apache与PHP的配置 Mavericks同以往的OSX一样自带了apache2.2.24和php5.4.17,但默认情况下没有开启,打开终端 sudo apachectl start 这时在浏览 ...
- phpstudy 80端口被占用,修改端口
搭建mantis,总会出现80端口被占用的情况.看到别的步骤是:1.cmd 运行netstat -ano查看80端口被什么占用,然后在任务管理器找到对应的结束进程.通常情况下是被System占用,右击 ...
- WebServices复习
- Unity Animation System(动画系统)
动画系统: 支持:动画融合,混合,叠加动画,行走循环的时间同步,动画层,控制动画的各个方面(时间,速度,融合权重) 带有每顶点1.2或4骨骼的蒙皮网格,以及支持基于物理的布娃娃系统和程序动画. ...