AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

AcWing 117. 占卜DIY    原题链接    简单

作者: 作者的头像   秦淮岸灯火阑珊 ,  2019-01-20 17:52:58 ,  所有人可见 ,  阅读 2727


12


2

题目描述

达达学会了使用扑克DIY占卜。

方法如下:

一副去掉大小王的扑克共52张,打乱后均分为13堆,编号1~13,每堆4张,其中第13堆称作“生命牌”,也就是说你有4条命。

这里边,4张K被称作死神。

初始状态下,所有的牌背面朝上扣下。

流程如下:

1.抽取生命牌中的最上面一张(第一张)。

2.把这张牌翻开,正面朝上,放到牌上的数字所对应编号的堆的最上边。(例如抽到2,正面朝上放到第2堆牌最上面,又比如抽到J,放到第11堆牌最上边,注意是正面朝上放)

3.从刚放了牌的那一堆最底下(最后一张)抽取一张牌,重复第2步。(例如你上次抽了2,放到了第二堆顶部,现在抽第二堆最后一张发现是8,又放到第8堆顶部.........)

4.在抽牌过程中如果抽到K,则称死了一条命,就扔掉K再从第1步开始。

5.当发现四条命都死了以后,统计现在每堆牌上边正面朝上的牌的数目,只要同一数字的牌出现4张正面朝上的牌(比如4个A),则称“开了一对”,当然4个K是不算的。

6.统计一共开了多少对,开了0对称作”极凶”,1~2对为“大凶”,3对为“凶”,4~5对为“小凶”,6对为“中庸”,7~8对“小吉”,9对为“吉”,10~11为“大吉”,12为“满堂开花,极吉”。

输入格式
一共输入13行数据,每行四个数字或字母,表示每堆牌的具体牌型(不区分花色只区分数字),每堆输入的顺序为从上到下。

为了便于读入,用0代表10。

同行数字用空格隔开。

输出格式
输出一个整数,代表统计得到的开出的总对数。

样例

输入样例:
8 5 A A
K 5 3 2
9 6 0 6
3 4 3 4
3 4 4 5
5 6 7 6
8 7 7 7
9 9 8 8
9 0 0 0
K J J J
Q A Q K
J Q 2 2
A K Q 2
输出样例:
9

搜索+模拟
感觉这道题目,就是一道纯模拟的题目,没有什么难点,大致有几个易错点,这里提醒一下。
  1. 每次拿该堆的末尾,这一点容易犯错,因为不是拿之前的第四张牌,而是当前的末尾的牌。
  2. 读入问题,这里读入需要特判几个点,也就是A,10,J,Q,K
  3. 注意存储问题,我的代码,下标0表示堆顶,5表示堆尾

其实这道题目,完全可以拿扑克牌玩一玩,然后就瞬间秒懂,做题超快的

C++ 代码

//来一波好看点的代码
#include <bits/stdc++.h>
using namespace std;
vector<int> a[14];
int sum[14],c[14];
inline int get(char x)
{
    if (x>='2' && x<='9')
        return x-'0';
    if (x=='A')
        return 1;
    if (x=='0')
        return 10;
    if (x=='J')
        return 11;
    if (x=='Q')
        return 12;
    if (x=='K')
        return 13;
}
int main()
{
    for(int i=1;i<=13;i++)
    {
        a[i].push_back(0);
        for(int j=1;j<=4;j++)
        {
            char ch=getchar();
            getchar();
            a[i].push_back(get(ch));
        }
        c[i]=4;
    }
    for(int i=1;i<=4;i++)
    {
        int x=a[13][i];
        while(x!=13)
        {
            sum[x]++;
            x=a[x][c[x]--];
        }
    }
    int ans=0;
    for(int i=1;i<=12;i++)
        if (sum[i]==4)
            ans++;
    cout<<ans;
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n,m,i,j,k,p[14][6],d[14][5],s[14];
void init()
{
    for (int i=1;i<=13;i++)
    {
        for (int j=1;j<=4;j++)
        {
            char ch=getchar();
            if (ch>='2' && ch<='9')
                d[i][j]=ch-'0';
            if (ch=='A')
                d[i][j]=1;
            if (ch=='0')
                d[i][j]=10;
            if (ch=='J')
                d[i][j]=11;
            if (ch=='Q')
                d[i][j]=12;
            if (ch=='K')
                d[i][j]=13;
            getchar();
        }
        p[i][5]=5;
    }
}
void dfs(int x)
{
    if (x==13)
        return ;
    p[x][++p[x][0]]=x;
    int cx=d[x][--p[x][5]];
    dfs(cx);
}
void sum(void)
{
    for (i=1;i<=13;i++)
        for (j=1;j<=4;j++)
            if (p[i][j])
                s[p[i][j]]++;
    int ans=0;
    for (i=1;i<=13;i++)
        if (s[i]==4)
            ans++;
    cout<<ans;  
}
int main()
{
    //freopen("stdin.in","r",stdin);
    //freopen("stdout.out","w",stdout); 
    init();
    for (i=1;i<=4;i++)
        dfs(d[13][i]);
    sum();
    return 0;
}
//代码略丑,不要在意。。。

4 评论


用户头像
化倾   2023-07-15 18:03         踩      回复

贴个python版

def I():
    return input()

def II():
    return int(input())

def MII():
    return map(int, input().split())

def LI():
    return list(input().split())

def LII():
    return list(map(int, input().split()))

def GMI():
    return map(lambda x: int(x) - 1, input().split())

def LGMI():
    return list(map(lambda x: int(x) - 1, input().split()))
# start-----------------------------------------------------
g = [['0']] + [LI() for _ in range(13)]
m = dict(zip('A234567890JQK',[i for i in range(1,14)]))
ans = [0] * 14
while ans[13] != 4:
    c = m[g[13].pop(0)]
    while c != 13:
        ans[c] += 1
        c = m[g[c].pop()]
    ans[c] += 1
res = 0
for i in range(1,13):
    if ans[i] == 4:
        res += 1
print(res)



# end-------------------------------------------------------

用户头像
lsz_   2022-02-14 10:36         踩      回复

p和s数组是干嘛的

用户头像
lsz_   2022-02-14 10:37         踩      回复

第二个die码


用户头像
Snow_raw   2021-09-19 19:42         踩      回复

难得自己单独a掉的指南题回头看看秦dlhh


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息