poj 3087 字符串+set(洗牌)
来源:互联网 发布:淘宝成功案例分析 编辑:程序博客网 时间:2024/06/07 07:12
题意:给定长度都为C两个字符串,S1,S2,和一个要求的结果字符串SS。先把S2的最下面一张牌放在最下面,然后S1,S2交错的叠放,得到S(洗牌操作)。
如果此时得到SS,则输出次数。否则再把S最下面的C个字符当做S1,把剩下的当做S2,再次重复上面的过程。如果不能得到目标字符串,则输出-1。
思路:模拟。
一开始只以为回到初始串则输出-1,实际上有可能会的变换过程中的任意一个串,那么循环了就应该输出-1。所以应该用一个判重的数据结构,set可以选择。
另外读入的时候一开始用的getchar,怎么着都WA,后来改成scanf才A(可能每一行后面有多余的空格)
#include <cstdio>#include <string>#include <set>#include <algorithm>using namespace std;#define clr(s,t) memset(s,t,sizeof(s))#define N 505int T,n,c;char s[N],t[N],base[N],tmp[N];set<string> flag;void inverse(char* x,int len){ int i,j; for(i = 0,j = len-1;i<j;i++,j--){ char ch = x[i]; x[i] = x[j]; x[j] = ch; }}int main(){ scanf("%d",&T); for(c = 1;c<=T;c++){ int i,res = 0; flag.clear(); scanf("%d\n",&n); scanf("%s %s %s",s+1,t+1,base+1); inverse(s+1,n); inverse(t+1,n); inverse(base+1,2*n); strcat(t+1, s+1); strcpy(s+1,t+1); tmp[2*n+1] = '\0'; while(strcmp(t+1, base+1)){//找到目标串 string ttt(t+1); flag.insert(ttt); for(i = 1;i<=2*n;i++){//这个公式纸上推一下即可 if(i&1) tmp[i] = t[i/2+n+1]; else tmp[i] = t[i/2]; } ttt = tmp+1; if(flag.count(ttt))//判重 break; res++; strcpy(t+1, tmp+1); } if(!strcmp(t+1, base+1)) printf("%d %d\n",c,res); else printf("%d %d\n",c,-1); } return 0;}
0 0
- poj 3087 字符串+set(洗牌)
- POJ 3087 Shuffle'm Up(洗牌)
- poj 1721 CARDS 洗牌机
- G - Shuffle'm Up POJ 3087 模拟洗牌的过程,算作暴力搜索也不为过
- 洗牌算法(shuffle)
- hdu 1210(洗牌)
- 洗牌问题(模拟)
- 洗牌(1)
- 洗牌(2)
- 洗牌(程序阅读)
- 洗牌
- 洗牌
- 洗牌
- 洗牌
- 洗牌
- 洗牌
- 洗牌
- 洗牌
- 迭代器失效小结
- 内存管理器(十)kernel内存管理----数据结构
- myeclipse6.5 反编译工具 jadclipse jad java反编译
- static和const的应用和作用
- 软件快速开发平台是什么
- poj 3087 字符串+set(洗牌)
- 乔布斯回答什么是面向对象
- Android学习路线指南
- STL迭代器失效问题
- REST API Authenticator for JAX-RS
- 软件开发行业如何在激烈竞争中取胜
- 查看oracle解析
- 德州扑克程序思路
- HSSFWorkBooK_demo