题解 P6529 【[COCI2015-2016#1] KARTE】

· · 题解

一道很简单的模拟,思路很简单,容易理解。

我们不用 STL 不用 struct

这里提供两种方法。

1

很正常的先读数据,用四个数组记录当前花色,当前点数的牌的数量。如果一张牌出现两次及以上,直接输出 GRESKA

然后将四个数组扫一遍,看一看有没有缺牌,缺的话就 就加 1

于是 code

#include<bits/stdc++.h>
#define FOR(i,j,k)  for(int i=(j);i<=(k);i++)
using namespace std;
char tmp;
int x;
int p[14],k[14],h[14],t[14];
int main()
{
    while(cin>>tmp)
    {
        cin>>x;
        if(tmp=='P')    p[x]++;
        else if(tmp=='K')   k[x]++;
        else if(tmp=='H')   h[x]++;
        else if(tmp=='T')   t[x]++;
        if(p[x]>1||k[x]>1||h[x]>1||t[x]>1)
        {
            printf("GRESKA\n");
            return 0;
        }
    }
    int nump=0,numk=0,numh=0,numt=0;
    for(int i=1;i<=13;i++)
    {
        if(p[i]==0) nump++;
        if(k[i]==0) numk++;
        if(h[i]==0) numh++;
        if(t[i]==0) numt++;
    }
    printf("%d %d %d %d",nump,numk,numh,numt);
    return 0;
}

2 :

我们一边读一边做。

一开始假设每个花色都没有一张牌。

于是

int ansp=13,ansk=13,ansh=13,anst=13;

然后每读入一张牌,就将对应花色数量减 1

读完,直接输出即可。

code
#include<bits/stdc++.h>
#define FOR(i,j,k)  for(int i=(j);i<=(k);i++)
using namespace std;
char tmp;
int x;
int p[14],k[14],h[14],t[14];
int ansp=13,ansk=13,ansh=13,anst=13;
int main()
{
    while(cin>>tmp)
    {
        cin>>x;
        if(tmp=='P')    p[x]++,ansp--;
        else if(tmp=='K')   k[x]++,ansk--;
        else if(tmp=='H')   h[x]++,ansh--;
        else if(tmp=='T')   t[x]++,anst--;
        if(p[x]>1||k[x]>1||h[x]>1||t[x]>1)
        {
            printf("GRESKA\n");
            return 0;
        }
    }
    printf("%d %d %d %d",ansp,ansk,ansh,anst);
    return 0;
}