题目链接

题意 : 一共52张牌(A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K)花色分别是C,D,H,S 。。。给助理5张牌,然后助理需要重新排一下次序,把第一张牌给观众,然后让魔术师根据一个规律对剩下的有一定次序的牌,能够猜出观众手里的牌是哪张。规律是:

  1. 记下剩下的四张牌里第一张的值和花色。
  2. 然后剩下三张,找出最小的那张(按值大小排,如果值一样大按照花色排序,花色的顺序是CDHS)所在的位置然后把这个位置的值加到原来记下的第一张牌的值上。
  3. 除了最小的那张,还有两张大的,如果这两张是有序的就把将第二步得到的值再加3.
  4. 所以观众手里的牌的值就是经过上述三步加起来的值,花色就是原来记下的第一张牌的花色。

比如说 4D 5H 10C 10D QH,助理需要按照5H QH 10D 10C 4D这个顺序,将5H给观众,然后将QH 10D 10C 4D给魔术师,因为魔术师手里第一张牌的花色是H,所以观众手里那张牌的花色是H,然后魔术师手里的第一张值是12,加上剩下的牌里最小的4D所在的位置3,是15,取完余就是2,然后因为10D和10C是无序的,所以要再加3,就是5,所以观众手里的牌是5H .

思路 : 这个题要猜的话不怎么好猜,所以就是两个循环枚举一下,然后再处理一下小细节什么的。取余那个地方有特例所以要注意

 //POJ 2200
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm> using namespace std ; char str[][] ;
//char ch[5][4] ;
int e ;
struct node
{
int num ;
int flo ;
} a[],ch[] ; int cmp(struct node a,struct node b)
{
if(a.num == b.num)
return a.flo < b.flo ;
return a.num < b.num ;
}
void inv()
{
for(int j = ; j < ; j++)
{
int len = strlen(str[j]) ;
if(len == ) a[j].num = ;
if(str[j][] == 'J') a[j].num = ;
else if(str[j][] == 'Q') a[j].num = ;
else if(str[j][] == 'K') a[j].num = ;
else if(str[j][] == 'A') a[j].num = ;
else if(str[j][] >= '' && str[j][] <= '') a[j].num = str[j][]-'' ;
if(str[j][len-] == 'C') a[j].flo = ;
if(str[j][len-] == 'D') a[j].flo = ;
if(str[j][len-] == 'H') a[j].flo = ;
if(str[j][len-] == 'S') a[j].flo = ; }
} void judge(struct node a)
{
if(a.num == )
printf("%c",'A') ;
else if(a.num == )
printf("") ;
else if(a.num == )
printf("J") ;
else if(a.num == )
printf("Q") ;
else if(a.num == )
printf("K") ;
else printf("%d",a.num) ;
if(a.flo == )
printf("S") ;
else if(a.flo == )
printf("H") ;
else if(a.flo == )
printf("D") ;
else if(a.flo == )
printf("C") ;
}
void solve()
{
int j ;
for(int i = ; i < ; i++)
{
for(j = ; j < ; j++)
{
if(i != j && a[i].flo == a[j].flo)
{
e = ;
for(int k = ; k < ; k++)
{ if(k != i && k != j)
{
ch[e].num = a[k].num ;
ch[e].flo = a[k].flo ;
e++ ;
//strcpy(ch[e++],str[k]) ;
}
}
sort(ch,ch+e,cmp) ;
int a1 = a[i].num ;
int a2 = a[j].num ;
if( a1 == (a2+)% || (a1 == &&a2 == ) )
{
printf("%s %s ",str[i],str[j]);
judge(ch[]) ;
printf(" ") ;
judge(ch[]) ;
printf(" ") ;
judge(ch[]) ;
printf("\n") ;
break;
}
else if(a1 == (a2+)% || (a1 == && a2 == ) )
{
printf("%s %s ",str[i],str[j]);
judge(ch[]) ;
printf(" ") ;
judge(ch[]) ;
printf(" ") ;
judge(ch[]) ;
printf("\n") ;
break;
}
else if(a1 == (a2+)% || (a1 == && a2 == ) )
{
printf("%s %s ",str[i],str[j]);
judge(ch[]) ;
printf(" ") ;
judge(ch[]) ;
printf(" ") ;
judge(ch[]) ;
printf("\n") ;
break;
}
else if(a1 == (a2+)% || (a1 == && a2 == ) )
{
printf("%s %s ",str[i],str[j]);
judge(ch[]) ;
printf(" ") ;
judge(ch[]) ;
printf(" ") ;
judge(ch[]) ;
printf("\n") ;
break;
}
else if(a1 == (a2+)% || (a1 == && a2 == ) )
{
printf("%s %s ",str[i],str[j]);
judge(ch[]) ;
printf(" ") ;
judge(ch[]) ;
printf(" ") ;
judge(ch[]) ;
printf("\n") ;
break;
}
else if(a1 == (a2+)% || (a1 == && a2 == ) )
{
printf("%s %s ",str[i],str[j]);
judge(ch[]) ;
printf(" ") ;
judge(ch[]) ;
printf(" ") ;
judge(ch[]) ;
printf("\n") ;
break;
}
}
}
if(j < ) break ;
}
}
int main()
{
int n ;
scanf("%d",&n) ;
for(int i = ; i <= n ; i++ )
{
for(int j = ; j < ; j++)
scanf("%s",str[j]) ;
inv() ;
printf("Problem %d: ",i) ;
solve() ;
}
return ;
}

这个是比赛的时候一宁手敲出来的

 #include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath> using namespace std; struct node
{
int num,flo;
} input[],temp[];
int cmp(const void *a,const void *b)
{
struct node *aa=(struct node *)a;
struct node *bb=(struct node *)b;
if(aa->num==bb->num)return aa->flo-bb->flo;
else return aa->num-bb->num;
}
char s[];
int flocnt[];
int judge(int p)
{
if(s[p]=='A')
return ;
else if(s[p]=='J')
return ;
else if(s[p]=='Q')
return ;
else if(s[p]=='K')
return ;
else if(s[p]=='C')
return ;
else if(s[p]=='D')
return ;
else if(s[p]=='H')
return ;
else if(s[p]=='S')
return ;
else return s[p]-''-;
}
bool vis[],flat;
bool max11(node a,node b)
{
if(a.num==b.num)
{
if(a.flo<b.flo)return true;
else return false;
}
else if(a.num<b.num)return true;
else return false;
}
void dfs(int x)
{
if(flat)
return ;
if(x==)
{
for(int i=; i<; i++)
{
if(flocnt[input[i].flo]>&&!flat)
{
temp[]=input[i];
vis[i]=true;
dfs();
vis[i]=false;
}
}
return ;
}
else if(x==)
{
for(int i=; i<; i++)
{
if(!vis[i]&&input[i].flo==temp[].flo&&!flat)
{
temp[]=input[i];
vis[i]=true;
dfs();
vis[i]=false;
}
}
}
else if(x==)
{
struct node sorted[];
struct node xxx=temp[];
for(int i=; i<; i++)
sorted[i-]=temp[i];
qsort(sorted,,sizeof(sorted[]),cmp);
int pp;
for(int i=; i<; i++)
{
if(temp[i].flo==sorted[].flo&&temp[i].num==sorted[].num)
{
pp=i;
break;
}
}
if(pp==)
{
xxx.num+=;
if(max11(temp[],temp[]))
{ }
else
xxx.num+=;
xxx.num%=;
if(xxx.flo==temp[].flo&&xxx.num==temp[].num)flat=true;
return;
}
else if(pp==)
{
xxx.num+=;
if(max11(temp[],temp[]))
{ }
else
xxx.num+=;
xxx.num%=;
if(xxx.flo==temp[].flo&&xxx.num==temp[].num)flat=true;
return;
}
else if(pp==)
{
xxx.num+=;
if(max11(temp[],temp[]))
{ }
else
xxx.num+=;
xxx.num%=;
if(xxx.flo==temp[].flo&&xxx.num==temp[].num)flat=true;
return;
}
}
else
{
for(int i=; i<; i++)
{
if(!vis[i]&&!flat)
{
temp[x]=input[i];
vis[i]=true;
dfs(x+);
vis[i]=false;
}
}
} }
void pri(int x)
{
if(temp[x].num==)printf("A");
else if(temp[x].num==)printf("J");
else if(temp[x].num==)printf("Q");
else if(temp[x].num==)printf("K");
else printf("%d",temp[x].num+);
if(temp[x].flo==)printf("C");
else if(temp[x].flo==)printf("D");
else if(temp[x].flo==)printf("H");
else if(temp[x].flo==)printf("S");
}
int main()
{
//freopen("data.in","r",stdin);
int t,len;
scanf("%d",&t);
while(t--)
{
memset(flocnt,,sizeof(flocnt));
for(int i=; i<; i++)
{
scanf("%s",s);
len=strlen(s);
if(len==)
{
input[i].flo=judge();
input[i].num=;
}
else
{
input[i].flo=judge();
input[i].num=judge();
}
flocnt[input[i].flo]++;
}
memset(vis,false,sizeof(vis));
flat=false;
dfs();
for(int i=; i<; i++)
{
pri(i);
printf(" ");
}
pri();
puts("");
}
return ;
}

POJ 2200 A Card Trick(模拟)的更多相关文章

  1. HDU 2319 Card Trick (模拟)

    题目链接 Problem Description The magician shuffles a small pack of cards, holds it face down and perform ...

  2. UESTC 890 Card Trick(DP 纸牌魔术)

    题意  给你一些牌  所有正面朝下放桌子上   你选一个起点    翻开那张牌   牌上的数字是几就向前走几步   J,Q,K 都是向前走10步  A向前走11步   知道向前走相应的步数后超过了终点 ...

  3. ny714 Card Trick

    Card Trick 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 The magician shuffles a small pack of cards, holds ...

  4. SPOJ 1108 Card Trick 暴力模拟

    解释一下样例,因为我觉得这个题意表述的不是很清楚.以第二组样例为例. 牌序为:3 1 4 5 2 第一轮:把 3 放到末尾:1 4 5 2 3,最顶上的牌是1,把1拿走.剩余 4 5 2 3 第二轮: ...

  5. poj 1008:Maya Calendar(模拟题,玛雅日历转换)

    Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 64795   Accepted: 19978 D ...

  6. POJ 1027 The Same Game(模拟)

    题目链接 题意 : 一个10×15的格子,有三种颜色的球,颜色相同且在同一片内的球叫做cluster(具体解释就是,两个球颜色相同且一个球可以通过上下左右到达另一个球,则这两个球属于同一个cluste ...

  7. POJ 3414 Pots【bfs模拟倒水问题】

    链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...

  8. poj 2632 Crashing Robots(模拟)

    链接:poj 2632 题意:在n*m的房间有num个机器,它们的坐标和方向已知,现给定一些指令及机器k运行的次数, L代表机器方向向左旋转90°,R代表机器方向向右旋转90°,F表示前进,每次前进一 ...

  9. poj 1028 Web Navigation(模拟)

    题目链接:http://poj.org/problem? id=1028 Description Standard web browsers contain features to move back ...

随机推荐

  1. Contoso 大学 - 3 - 排序、过滤及分页

    原文 Contoso 大学 - 3 - 排序.过滤及分页 目录 Contoso 大学 - 使用 EF Code First 创建 MVC 应用 原文地址:http://www.asp.net/mvc/ ...

  2. Git 的简单使用

    一直在使用Git,仅限于简单的使用,但还是记不住几个简单.在这边总结一下,加深印象,也方便查找. 安装Git 平常主要在windows和ubuntu上工作,就以windows为例,Linux和Mac平 ...

  3. Mysql 的安装与配置

    MySQL的安装 第1步:下载 第2 步:以管理员身份进行安装 第3步:选择安装类型. 第4步:设置MySQL安装目录,及数据库文件目录 第5步:安装结束,开启配置向导 第6步:选择配置类型 第7步: ...

  4. IOCP模型总结(转)

    IOCP模型总结(转) IOCP(I/O Completion Port,I/O完成端口)是性能最好的一种I/O模型.它是应用程序使用线程池处理异步I/O请求的一种机制.在处理多个并发的异步I/O请求 ...

  5. ios水果风暴游戏源码下载

    游戏源码是从那个IOS教程网IOS.662p.com分享给大家的. 这是一款ios水果风暴游戏源码下载,介绍给大家一下,喜欢的朋友可以下载学习一下吧.应用介绍:这是一个以获得高分和挑战更高难度为目的的 ...

  6. Ueditor设置默认字体

    其实很简单,只需要将ueditor.all.js 以及 ueditor.all.min.js 两个文件中的字体改掉即可 修改方法: 在ueditor.all.js中搜索:设置默认字体和字号: 在ued ...

  7. Android 源码VecotorDrawable

    1 R.styleable.VectorDrawable_viewportWidth 该资源的名字并非VectorDrawable_viewportWidth 而是 attrs.xml 下的声明 &l ...

  8. 百度地图API实现多区域标记

    最近遇到一个业务就是需要需要在地图上标记多个区域.一般餐饮业做外卖的,配送范围一般是多区域的,那么在地图上标记配送范围的时候就需要能标记多个区域.长话短说,最初的实现原型的截图如下:

  9. 手工添加Linux防火墙端口

    在linux实际操作中经常需要对防火墙进行修改,比如经常要修改或添加相关端口,下面以添加运行Tomcat所需8080端口为例: (以下命令操作均为root用户) 1.编辑iptables文件 # vi ...

  10. delphi xe memory leak produced in WSDLLookup.pas

    constructor TWSDLLookup.Create; begin FLookup := TDictionary<string, Variant>.Create; end; des ...