POJ 3087 Shuffle'm Up
2016-04-29 21:29
323 查看
题目大意
就是给你2副牌,让你通过先从第二副牌的下面拿出一张牌,再从第一副牌的下面拿出一张牌,直到所有牌全部拿完,循环往复执行这个过程,如果循环了则输出-1,如果在这个过程中2副牌洗牌得到的牌就是题目中给的需要洗出来的牌,那么输出洗了多少次才得到这样的结果。题目解法
就是简单的模拟题,不停地洗牌,比较,还有判断是否循环就可以了,我的注释写的很详细,这里就不多说了。#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int maxn = 105; char s1[maxn],s2[maxn]; char temp1[maxn],temp2[maxn]; //存储初始值 char sum[2*maxn],target[2*maxn]; int main() { int T,n; scanf("%d", &T); for(int kase = 1; kase <= T; kase++) { scanf("%d", &n); scanf("%s%s%s", s1, s2, target); memcpy(temp1,s1,sizeof(s1)); memcpy(temp2,s2,sizeof(s2)); int ans = 0; while(true) { for(int i = 0; i < 2*n; i++) //此步骤相当于将2副牌放在一起的操作,先放s2,再放s1 if(i%2) sum[i] = s1[i/2]; else sum[i] = s2[i/2]; sum[2*n] = '\0'; //注意加字符串结束符 ans++; if(!strcmp(sum,target)) //找到了目标牌 break; for(int i = 0; i < n; i++) //重新分牌 { s1[i] = sum[i]; s2[i] = sum[i+n]; } if(!strcmp(s1,temp1) && !strcmp(s2,temp2)) //已经开始循环到最初的那2副牌了,说明无法找到目标牌了 { ans = -1; break; } } printf("%d %d\n", kase, ans); } return 0; }
相关文章推荐
- HDOJ(HDU) 2083 简易版之最短距离(中位数)
- CentOS系统:no space left on device错误
- HDOJ(HDU) 2083 简易版之最短距离(中位数)
- .NET WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制
- 【GOF】代理模式(proxy)之静态代理
- C++多态性
- Ionic使用ngCordova插件,以Geolocation地理定位为例
- 读取一个字符c++
- 四旋翼动力学和仿真翻译(Quadcopter Dynamics and Simulation)
- LeetCode|Ugly Number
- leetcode 345:Reverse Vowels of a String
- scala学习第三弹:scala实战
- 记一次DRBD Unknown故障处理过程 推荐
- hdu 2855 Fibonacci Check-up【递推+矩阵快速幂】
- 第二课 函数调用
- 有关测试说明书的概述与摘要
- Java之美[从菜鸟到高手演变]之设计模式
- Sublime3安装PackageControl,然后安装GoSublime
- 题目来源于欧拉计划的数学OJ。。。
- InstallShield 2015 Limited Edition for Visual Studio打包发布项目软件