洛谷 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;
}

posted @ 2020-08-08 21:15  LJC001151  阅读(96)  评论(0)    收藏  举报