1. 程式人生 > 實用技巧 >洛谷 P6529 【[COCI2015-2016#1] KARTE】

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