c++ - ACM小程序问题

查看:58
本文介绍了c++ - ACM小程序问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

题目链接在这里
http://chjsgl.openjudge.cn/pr...

赋上我的代码:

#include<stdio.h>
#include<string.h>
char a[12][3];
char b[12][3];
int n, m;
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++)
        scanf("%s", a[i]);
    for (int i = 0; i < m; i++)
        scanf("%s", b[i]);
    int cnta1 = 0;
    int cnta2 = 0;
    int cntjqk1 = 0;
    int cntjqk2 = 0;
    int sum1 = 0;
    int sum2 = 0;
    int flag1 = 0;
    int flag2 = 0;
    for (int i = 0; i < n; i++)
    {
        if (strcmp(a[i], "A") == 0)
        {
            sum1 += 1;
            cnta1++;
        }
        else if (strcmp(a[i], "10") == 0)
        {
            sum1 += 10;
            cntjqk1++;
        }
        else if (strcmp(a[i], "J") == 0)
        {
            sum1 += 10;
            cntjqk1++;
        }
        else if (strcmp(a[i], "Q") == 0)
        {
            sum1 += 10;
            cntjqk1++;
        }
        else if (strcmp(a[i], "K") == 0)
        {
            sum1 += 10;
            cntjqk1++;
        }
        else
            sum1 += a[i][0] - '0';
    }
    if (n == 2 && cnta1 == 1 && cntjqk1 == 1)
        flag1 = 1;
    while (cnta1 != 0 && sum1 <= 21)
    {
        sum1 += 10;
        cnta1--;
    }
    for (int i = 0; i < m; i++)
    {
        if (strcmp(b[i], "A") == 0)
        {
            sum2 += 1;
            cnta2++;
        }
        else if (strcmp(b[i], "10") == 0)
        {
            sum2 += 10;
            cntjqk2++;
        }
        else if (strcmp(b[i], "J") == 0)
        {
            sum2 += 10;
            cntjqk2++;
        }
        else if (strcmp(b[i], "Q") == 0)
        {
            sum2 += 10;
            cntjqk2++;
        }
        else if (strcmp(b[i], "K") == 0)
        {
            sum2 += 10;
            cntjqk2++;
        }
        else
            sum2 += b[i][0] - '0';
    }
    if (m == 2 && cnta2 == 1 && cntjqk2 == 1)
        flag2 = 1;
    while (cnta2 != 0 && sum2 <= 21)
    {
        sum2 += 10;
        cnta2--;
    }
    if (sum2 > 21)
        puts("win");
    else if (sum1 > 21)
        puts("lose");
    else if (flag1 == 1 && flag2 == 0)
        puts("win");
    else if (flag1 == 0 && flag2 == 1)
        puts("lose");
    else if (flag1 == 1 && flag2 == 1)
        puts("draw");
    else if (sum1 > sum2)
        puts("win");
    else if (sum1 < sum2)
        puts("lose");
    else if (sum1 == sum2)
        puts("draw");
    return 0;
}

题目给的那个测试用例也过了,但是提交总是不对,不知道问题出现在哪里,还请高手帮帮忙!!谢谢啦!!O(∩_∩)O~

解决方案

这个题目输入输出样例我就搞不明白了

2
    A
    10    A=11,11+10 = 21
3
    5
    10
    6    5+10+6 = 21

我算出来的是平局!

我写了一份代码,没有验证,你可是看看。

#include <stdio.h>

int calc_score(int n,int* p)
{
    int ACount = 0;    // A 计数
    int score = 0;    // 成绩
    for(int i=0;i<n;++i){
        switch(p[i]){
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                score += p[i] - '0';    // 2-10就是牌面值
                break;
            case '1':
                score += 10;    // 这个1实际是10
                break;
            case 'J':
            case 'Q':
            case 'K':
                score += 10;    // JQK都是10
                if(ACount && n == 2){
                    score = 10000;    // 黑杰克就是10000分
                    return score;
                }
                break;
            case 'A':
                ACount += 1;
                score += 11;    // A 都先按照11分算
                break;
        }
    }

    // 不是黑杰克,继续算点数
    while(score > 21 && ACount > 0){
        score -= 10;
        ACount -= 1;
    }
    return score > 21:-1:score;    // 大于21分,则算是-1分
}

int main()
{
    int n,m,nscore,mscore;
    int pn[16],pm[16];
    char buf[1024];
    scanf("%d",&n);
    for(int i=0;i<n;++i){
        scanf("%s",buf);
        pn[i] = buf[0];
    }
    scanf("%d",&m);
    for(int i=0;i<m;++i){
        scanf("%s",buf);
        pm[i] = buf[0];
    }
    nscore = calc_score(n,pn);
    mscore = calc_score(m,pm);

    printf("%s",(nscore == mscore)?"draw":((nscore < mscore)?"lose":"win"));
}

这篇关于c++ - ACM小程序问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆