【模拟】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 ...
随机推荐
- mac gem install nokogiri error
Gem::Ext::BuildError: ERROR: Failed to build gem native extension. /Users/angela/.rbenv/versions/1.9 ...
- C# I/O
获取运行时的动态目录 private static string GetDataDir_Data() { var parent = Directory.GetParent(Directory.GetC ...
- nova instance出错:"message": "Proxy error: 502 Read from server failed
执行 $ nova resize instance1 时候出错: {, "details": " File \"/opt/stack/nova/nova/com ...
- [转]python 常用类库!
Python学习 On this page... (hide) 1. 基本安装 2. Python文档 2.1 推荐资源站点 2.2 其他参考资料 2.3 代码示例 3. 常用工具 3.1 Pytho ...
- Mosquitto pub/sub服务实现代码浅析-主体框架
Mosquitto 是一个IBM 开源pub/sub订阅发布协议 MQTT 的一个单机版实现(目前也只有单机版),MQTT主打轻便,比较适用于移动设备等上面,花费流量少,解析代价低.相对于XMPP等来 ...
- [java]OutOfMemoryError 原因及解决办法
导致OutOfMemoryError异常的常见原因有以下几种: 内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 代码中存在死循环 ...
- Reason: image not found
刚生的Xcode8,出现好多Error,有些Error真的太麻烦不想记录,现在这个挺简单的,就记下来,控制台输出的Error信息如下: fix: Target -> Build Phases - ...
- C#Linq技术中SelectMany(...)的内部实现推测
对于声明为:public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable&l ...
- WPF 通过Border来画边框
WPF有自己的表格控件DataGrid.ListBox等,如果只是简单的需求,可以通过Border控件来画边框. 比如我们需要给上面的控件加上边框. <Window x:Class=" ...
- python 的 集合,字典,元组,列表
元组 tuple a = (1,2,3) 元组不能修改 可权嵌套列表 如 (1,2,3,[1,2,3]) 里面的列表可修改 一般不这样用 列表list a = [1,2,3] 集合set a ...